aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2024-01-18 16:31:38 +0900
committerMichael Paquier <michael@paquier.xyz>2024-01-18 16:31:38 +0900
commitc030e263e7fed65d5f936e8b3bb13da22bb09fdb (patch)
treec9e24584f24f6fc243a7de47e0b64b26e37a2f2e
parent7ce65c6f7209fcbc73605c914c37c4b2a6406213 (diff)
downloadpostgresql-c030e263e7fed65d5f936e8b3bb13da22bb09fdb.tar.gz
postgresql-c030e263e7fed65d5f936e8b3bb13da22bb09fdb.zip
Improve handling of dropped partitioned indexes for REINDEX INDEX
A REINDEX INDEX done on a partitioned index builds a list of the indexes to work on before processing its partitions in individual transactions. When combined with a DROP of the partitioned index, there was a window where it was possible to see some unexpected "could not open relation with OID", synonym of relation lookup error. The code was robust enough to handle the case where the parent relation is missing, but not the case where an index would be gone missing. This is similar to 1d65416661bb. Support for REINDEX on partitioned relations has been introduced in a6642b3ae060, so backpatch down to 14. Author: Fei Changhong Discussion: https://postgr.es/m/tencent_6A52106095ACDE55333E3AD33F304C0C3909@qq.com Backpatch-through: 14
-rw-r--r--src/backend/catalog/index.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 299ef642b3f..1cc6714e8cb 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -3633,7 +3633,24 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence,
* Open the target index relation and get an exclusive lock on it, to
* ensure that no one else is touching this particular index.
*/
- iRel = index_open(indexId, AccessExclusiveLock);
+ if ((params->options & REINDEXOPT_MISSING_OK) != 0)
+ iRel = try_index_open(indexId, AccessExclusiveLock);
+ else
+ iRel = index_open(indexId, AccessExclusiveLock);
+
+ /* if index relation is gone, leave */
+ if (!iRel)
+ {
+ /* Roll back any GUC changes */
+ AtEOXact_GUC(false, save_nestlevel);
+
+ /* Restore userid and security context */
+ SetUserIdAndSecContext(save_userid, save_sec_context);
+
+ /* Close parent heap relation, but keep locks */
+ table_close(heapRelation, NoLock);
+ return;
+ }
if (progress)
pgstat_progress_update_param(PROGRESS_CREATEIDX_ACCESS_METHOD_OID,