agora inbox for [email protected]help / color / mirror / Atom feed
[PATCH v10 2/3] Add SKIPVALID flag for more integration 236+ messages / 1 participants [nested] [flat]
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v10 2/3] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c1dd4c8362..f4d49f5bf6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1597,53 +1597,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2927,6 +2904,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 93fd796163..d099378951 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3356,10 +3356,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --i3lJ51RuaGWuFYNw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v12 2/5] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 52 +++++++++++--------------------- src/include/catalog/index.h | 1 + 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index c513e8a6bd..89c2f62eda 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1628,54 +1628,31 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; ReindexParams params = { .options = REINDEXOPT_CONCURRENTLY }; - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, ¶ms); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, ¶ms, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -3037,6 +3014,11 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((params->options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 266f8950dc..6673122ec2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -40,6 +40,7 @@ typedef struct ReindexParams #define REINDEXOPT_REPORT_PROGRESS 0x02 /* report pgstat progress */ #define REINDEXOPT_MISSING_OK 0x04 /* skip missing relations */ #define REINDEXOPT_CONCURRENTLY 0x08 /* concurrent mode */ +#define REINDEXOPT_SKIPVALID 0x10 /* skip valid indexes */ /* state info for validate_index bulkdelete callback */ typedef struct ValidateIndexState -- 2.17.0 --MfFXiAuoTsnnDAfZ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
* [PATCH v11 2/9] Add SKIPVALID flag for more integration @ 2020-10-30 21:23 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 236+ messages in thread From: Justin Pryzby @ 2020-10-30 21:23 UTC (permalink / raw) --- src/backend/commands/indexcmds.c | 54 +++++++++++--------------------- src/include/nodes/parsenodes.h | 7 +++-- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 76219381c1..ffc166206b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1617,53 +1617,30 @@ DefineIndex(Oid relationId, return address; } -/* Reindex invalid child indexes created earlier */ +/* + * Reindex invalid child indexes created earlier thereby validating + * the parent index. + */ static void reindex_invalid_child_indexes(Oid indexRelationId) { - ListCell *lc; - int npart = 0; - - MemoryContext ind_context = AllocSetContextCreate(PortalContext, "CREATE INDEX", - ALLOCSET_DEFAULT_SIZES); - MemoryContext oldcontext; - List *childs = find_inheritance_children(indexRelationId, ShareLock); - List *partitions = NIL; - - PreventInTransactionBlock(true, "REINDEX INDEX"); - - foreach (lc, childs) - { - Oid partoid = lfirst_oid(lc); - - pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, - npart++); - - if (get_index_isvalid(partoid) || - !RELKIND_HAS_STORAGE(get_rel_relkind(partoid))) - continue; - - /* Save partition OID */ - oldcontext = MemoryContextSwitchTo(ind_context); - partitions = lappend_oid(partitions, partoid); - MemoryContextSwitchTo(oldcontext); - } - - /* - * Process each partition listed in a separate transaction. Note that - * this commits and then starts a new transaction immediately. - */ - ReindexMultipleInternal(partitions, REINDEXOPT_CONCURRENTLY); - /* * CIC needs to mark a partitioned index as VALID, which itself * requires setting READY, which is unset for CIC (even though * it's meaningless for an index without storage). * This must be done only while holding a lock which precludes adding * partitions. - * See also: validatePartitionedIndex(). */ + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_READY); + + /* + * Process each partition listed in a separate transaction. Note that + * this commits and then starts a new transaction immediately. + */ + ReindexPartitions(indexRelationId, + REINDEXOPT_CONCURRENTLY | REINDEXOPT_SKIPVALID, true); + CommandCounterIncrement(); index_set_state_flags(indexRelationId, INDEX_CREATE_SET_VALID); } @@ -2947,6 +2924,11 @@ ReindexPartitions(Oid relid, int options, bool isTopLevel) if (!RELKIND_HAS_STORAGE(partkind)) continue; + /* Skip invalid indexes, if requested */ + if ((options & REINDEXOPT_SKIPVALID) != 0 && + get_index_isvalid(partoid)) + continue; + Assert(partkind == RELKIND_INDEX || partkind == RELKIND_RELATION); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index d1f9ef29ca..1373b57ae7 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3347,10 +3347,11 @@ typedef struct ConstraintsSetStmt */ /* Reindex options */ -#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ +#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */ #define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */ -#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ -#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */ +#define REINDEXOPT_CONCURRENTLY (1 << 3) /* concurrent mode */ +#define REINDEXOPT_SKIPVALID (1 << 4) /* skip valid indexes */ typedef enum ReindexObjectType { -- 2.17.0 --cWoXeonUoKmBZSoM Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0003-ReindexPartitions-to-set-indisvalid.patch" ^ permalink raw reply [nested|flat] 236+ messages in thread
end of thread, other threads:[~2020-10-30 21:23 UTC | newest] Thread overview: 236+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v10 2/3] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v12 2/5] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]> 2020-10-30 21:23 [PATCH v11 2/9] Add SKIPVALID flag for more integration Justin Pryzby <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox