char *relationName = NULL;
char *relationNamespace = NULL;
PGRUsage ru0;
+ const int progress_index[] = {
+ PROGRESS_CREATEIDX_COMMAND,
+ PROGRESS_CREATEIDX_PHASE,
+ PROGRESS_CREATEIDX_INDEX_OID,
+ PROGRESS_CREATEIDX_ACCESS_METHOD_OID
+ };
+ int64 progress_vals[4];
/*
* Create a memory context that will survive forced transaction commits we
pgstat_progress_start_command(PROGRESS_COMMAND_CREATE_INDEX,
RelationGetRelid(heapRel));
- pgstat_progress_update_param(PROGRESS_CREATEIDX_COMMAND,
- PROGRESS_CREATEIDX_COMMAND_REINDEX_CONCURRENTLY);
- pgstat_progress_update_param(PROGRESS_CREATEIDX_INDEX_OID,
- indexId);
- pgstat_progress_update_param(PROGRESS_CREATEIDX_ACCESS_METHOD_OID,
- indexRel->rd_rel->relam);
+ progress_vals[0] = PROGRESS_CREATEIDX_COMMAND_REINDEX_CONCURRENTLY;
+ progress_vals[1] = 0; /* initializing */
+ progress_vals[2] = indexId;
+ progress_vals[3] = indexRel->rd_rel->relam;
+ pgstat_progress_update_multi_param(4, progress_index, progress_vals);
/* Choose a temporary relation name for the new index */
concurrentName = ChooseRelationName(get_rel_name(indexId),
WaitForLockersMultiple(lockTags, ShareLock, true);
CommitTransactionCommand();
- forboth(lc, indexIds, lc2, newIndexIds)
+ foreach(lc, newIndexIds)
{
- Relation indexRel;
- Oid oldIndexId = lfirst_oid(lc);
- Oid newIndexId = lfirst_oid(lc2);
+ Relation newIndexRel;
+ Oid newIndexId = lfirst_oid(lc);
Oid heapId;
+ Oid indexam;
/* Start new transaction for this index's concurrent build */
StartTransactionCommand();
* Index relation has been closed by previous commit, so reopen it to
* get its information.
*/
- indexRel = index_open(oldIndexId, ShareUpdateExclusiveLock);
- heapId = indexRel->rd_index->indrelid;
- index_close(indexRel, NoLock);
+ newIndexRel = index_open(newIndexId, ShareUpdateExclusiveLock);
+ heapId = newIndexRel->rd_index->indrelid;
+ indexam = newIndexRel->rd_rel->relam;
+ index_close(newIndexRel, NoLock);
+
+ /*
+ * Update progress for the index to build, with the correct parent
+ * table involved.
+ */
+ pgstat_progress_start_command(PROGRESS_COMMAND_CREATE_INDEX, heapId);
+ progress_vals[0] = PROGRESS_CREATEIDX_COMMAND_REINDEX_CONCURRENTLY;
+ progress_vals[1] = PROGRESS_CREATEIDX_PHASE_BUILD;
+ progress_vals[2] = newIndexId;
+ progress_vals[3] = indexam;
+ pgstat_progress_update_multi_param(4, progress_index, progress_vals);
/* Perform concurrent build of new index */
index_concurrently_build(heapId, newIndexId);
Oid heapId;
TransactionId limitXmin;
Snapshot snapshot;
+ Relation newIndexRel;
+ Oid indexam;
StartTransactionCommand();
*/
CHECK_FOR_INTERRUPTS();
- heapId = IndexGetRelation(newIndexId, false);
-
/*
* Take the "reference snapshot" that will be used by validate_index()
* to filter candidate tuples.
snapshot = RegisterSnapshot(GetTransactionSnapshot());
PushActiveSnapshot(snapshot);
+ /*
+ * Index relation has been closed by previous commit, so reopen it to
+ * get its information.
+ */
+ newIndexRel = index_open(newIndexId, ShareUpdateExclusiveLock);
+ heapId = newIndexRel->rd_index->indrelid;
+ indexam = newIndexRel->rd_rel->relam;
+ index_close(newIndexRel, NoLock);
+
+ /*
+ * Update progress for the index to build, with the correct parent
+ * table involved.
+ */
+ pgstat_progress_start_command(PROGRESS_COMMAND_CREATE_INDEX, heapId);
+ progress_vals[0] = PROGRESS_CREATEIDX_COMMAND_REINDEX_CONCURRENTLY;
+ progress_vals[1] = PROGRESS_CREATEIDX_PHASE_VALIDATE_IDXSCAN;
+ progress_vals[2] = newIndexId;
+ progress_vals[3] = indexam;
+ pgstat_progress_update_multi_param(4, progress_index, progress_vals);
+
validate_index(heapId, newIndexId, snapshot);
/*
*/
pgstat_progress_update_param(PROGRESS_CREATEIDX_PHASE,
- PROGRESS_CREATEIDX_PHASE_WAIT_4);
+ PROGRESS_CREATEIDX_PHASE_WAIT_5);
WaitForLockersMultiple(lockTags, AccessExclusiveLock, true);
PushActiveSnapshot(GetTransactionSnapshot());