@@ -2803,6 +2803,13 @@ ReindexRelationConcurrently(Oid relationOid, int options)
2803
2803
char * relationName = NULL ;
2804
2804
char * relationNamespace = NULL ;
2805
2805
PGRUsage ru0 ;
2806
+ const int progress_index []= {
2807
+ PROGRESS_CREATEIDX_COMMAND ,
2808
+ PROGRESS_CREATEIDX_PHASE ,
2809
+ PROGRESS_CREATEIDX_INDEX_OID ,
2810
+ PROGRESS_CREATEIDX_ACCESS_METHOD_OID
2811
+ };
2812
+ int64 progress_vals [4 ];
2806
2813
2807
2814
/*
2808
2815
* Create a memory context that will survive forced transaction commits we
@@ -3045,12 +3052,11 @@ ReindexRelationConcurrently(Oid relationOid, int options)
3045
3052
3046
3053
pgstat_progress_start_command (PROGRESS_COMMAND_CREATE_INDEX ,
3047
3054
RelationGetRelid (heapRel ));
3048
- pgstat_progress_update_param (PROGRESS_CREATEIDX_COMMAND ,
3049
- PROGRESS_CREATEIDX_COMMAND_REINDEX_CONCURRENTLY );
3050
- pgstat_progress_update_param (PROGRESS_CREATEIDX_INDEX_OID ,
3051
- indexId );
3052
- pgstat_progress_update_param (PROGRESS_CREATEIDX_ACCESS_METHOD_OID ,
3053
- indexRel -> rd_rel -> relam );
3055
+ progress_vals [0 ]= PROGRESS_CREATEIDX_COMMAND_REINDEX_CONCURRENTLY ;
3056
+ progress_vals [1 ]= 0 ;/* initializing */
3057
+ progress_vals [2 ]= indexId ;
3058
+ progress_vals [3 ]= indexRel -> rd_rel -> relam ;
3059
+ pgstat_progress_update_multi_param (4 ,progress_index ,progress_vals );
3054
3060
3055
3061
/* Choose a temporary relation name for the new index */
3056
3062
concurrentName = ChooseRelationName (get_rel_name (indexId ),
@@ -3154,12 +3160,12 @@ ReindexRelationConcurrently(Oid relationOid, int options)
3154
3160
WaitForLockersMultiple (lockTags ,ShareLock , true);
3155
3161
CommitTransactionCommand ();
3156
3162
3157
- forboth (lc , indexIds , lc2 ,newIndexIds )
3163
+ foreach (lc ,newIndexIds )
3158
3164
{
3159
- Relation indexRel ;
3160
- Oid oldIndexId = lfirst_oid (lc );
3161
- Oid newIndexId = lfirst_oid (lc2 );
3165
+ Relation newIndexRel ;
3166
+ Oid newIndexId = lfirst_oid (lc );
3162
3167
Oid heapId ;
3168
+ Oid indexam ;
3163
3169
3164
3170
/* Start new transaction for this index's concurrent build */
3165
3171
StartTransactionCommand ();
@@ -3178,9 +3184,21 @@ ReindexRelationConcurrently(Oid relationOid, int options)
3178
3184
* Index relation has been closed by previous commit, so reopen it to
3179
3185
* get its information.
3180
3186
*/
3181
- indexRel = index_open (oldIndexId ,ShareUpdateExclusiveLock );
3182
- heapId = indexRel -> rd_index -> indrelid ;
3183
- index_close (indexRel ,NoLock );
3187
+ newIndexRel = index_open (newIndexId ,ShareUpdateExclusiveLock );
3188
+ heapId = newIndexRel -> rd_index -> indrelid ;
3189
+ indexam = newIndexRel -> rd_rel -> relam ;
3190
+ index_close (newIndexRel ,NoLock );
3191
+
3192
+ /*
3193
+ * Update progress for the index to build, with the correct parent
3194
+ * table involved.
3195
+ */
3196
+ pgstat_progress_start_command (PROGRESS_COMMAND_CREATE_INDEX ,heapId );
3197
+ progress_vals [0 ]= PROGRESS_CREATEIDX_COMMAND_REINDEX_CONCURRENTLY ;
3198
+ progress_vals [1 ]= PROGRESS_CREATEIDX_PHASE_BUILD ;
3199
+ progress_vals [2 ]= newIndexId ;
3200
+ progress_vals [3 ]= indexam ;
3201
+ pgstat_progress_update_multi_param (4 ,progress_index ,progress_vals );
3184
3202
3185
3203
/* Perform concurrent build of new index */
3186
3204
index_concurrently_build (heapId ,newIndexId );
@@ -3209,6 +3227,8 @@ ReindexRelationConcurrently(Oid relationOid, int options)
3209
3227
Oid heapId ;
3210
3228
TransactionId limitXmin ;
3211
3229
Snapshot snapshot ;
3230
+ Relation newIndexRel ;
3231
+ Oid indexam ;
3212
3232
3213
3233
StartTransactionCommand ();
3214
3234
@@ -3219,15 +3239,33 @@ ReindexRelationConcurrently(Oid relationOid, int options)
3219
3239
*/
3220
3240
CHECK_FOR_INTERRUPTS ();
3221
3241
3222
- heapId = IndexGetRelation (newIndexId , false);
3223
-
3224
3242
/*
3225
3243
* Take the "reference snapshot" that will be used by validate_index()
3226
3244
* to filter candidate tuples.
3227
3245
*/
3228
3246
snapshot = RegisterSnapshot (GetTransactionSnapshot ());
3229
3247
PushActiveSnapshot (snapshot );
3230
3248
3249
+ /*
3250
+ * Index relation has been closed by previous commit, so reopen it to
3251
+ * get its information.
3252
+ */
3253
+ newIndexRel = index_open (newIndexId ,ShareUpdateExclusiveLock );
3254
+ heapId = newIndexRel -> rd_index -> indrelid ;
3255
+ indexam = newIndexRel -> rd_rel -> relam ;
3256
+ index_close (newIndexRel ,NoLock );
3257
+
3258
+ /*
3259
+ * Update progress for the index to build, with the correct parent
3260
+ * table involved.
3261
+ */
3262
+ pgstat_progress_start_command (PROGRESS_COMMAND_CREATE_INDEX ,heapId );
3263
+ progress_vals [0 ]= PROGRESS_CREATEIDX_COMMAND_REINDEX_CONCURRENTLY ;
3264
+ progress_vals [1 ]= PROGRESS_CREATEIDX_PHASE_VALIDATE_IDXSCAN ;
3265
+ progress_vals [2 ]= newIndexId ;
3266
+ progress_vals [3 ]= indexam ;
3267
+ pgstat_progress_update_multi_param (4 ,progress_index ,progress_vals );
3268
+
3231
3269
validate_index (heapId ,newIndexId ,snapshot );
3232
3270
3233
3271
/*
@@ -3362,7 +3400,7 @@ ReindexRelationConcurrently(Oid relationOid, int options)
3362
3400
*/
3363
3401
3364
3402
pgstat_progress_update_param (PROGRESS_CREATEIDX_PHASE ,
3365
- PROGRESS_CREATEIDX_PHASE_WAIT_4 );
3403
+ PROGRESS_CREATEIDX_PHASE_WAIT_5 );
3366
3404
WaitForLockersMultiple (lockTags ,AccessExclusiveLock , true);
3367
3405
3368
3406
PushActiveSnapshot (GetTransactionSnapshot ());