From 854eec73803d648db83a1097c36c5247dd6f111b Mon Sep 17 00:00:00 2001 From: Onur Tirtir Date: Fri, 12 Nov 2021 12:30:09 +0300 Subject: [PATCH] Skip deleting options if columnar.options is already dropped (#5458) Drop extension might cascade to columnar.options before dropping a columnar table. In that case, we were getting below error when opening columnar.options to delete records for the columnar table that we are about to drop.: "ERROR: could not open relation with OID 0". I somehow reproduced this bug easily when upgrading pg, that is why adding added the test to after_pg_upgrade_schedule. (cherry picked from commit 25024b776ecbbb79753176ec1a5869588d005a10) Conflicts: src/test/regress/after_pg_upgrade_schedule src/test/regress/expected/upgrade_columnar_after.out src/test/regress/sql/upgrade_columnar_after.sql --- src/backend/columnar/columnar_metadata.c | 9 +++++++-- src/test/regress/after_pg_upgrade_schedule | 6 +++++- .../regress/expected/upgrade_columnar_after.out | 12 ++++++++++++ src/test/regress/sql/upgrade_columnar_after.sql | 13 +++++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/backend/columnar/columnar_metadata.c b/src/backend/columnar/columnar_metadata.c index b6aab8922..63fcfc116 100644 --- a/src/backend/columnar/columnar_metadata.c +++ b/src/backend/columnar/columnar_metadata.c @@ -318,8 +318,13 @@ DeleteColumnarTableOptions(Oid regclass, bool missingOk) */ Assert(!IsBinaryUpgrade); - Relation columnarOptions = relation_open(ColumnarOptionsRelationId(), - RowExclusiveLock); + Relation columnarOptions = try_relation_open(ColumnarOptionsRelationId(), + RowExclusiveLock); + if (columnarOptions == NULL) + { + /* extension has been dropped */ + return false; + } /* find existing item to remove */ ScanKeyData scanKey[1] = { 0 }; diff --git a/src/test/regress/after_pg_upgrade_schedule b/src/test/regress/after_pg_upgrade_schedule index 8e3a87fbe..7228c8b90 100644 --- a/src/test/regress/after_pg_upgrade_schedule +++ b/src/test/regress/after_pg_upgrade_schedule @@ -1 +1,5 @@ -test: upgrade_basic_after upgrade_columnar_after upgrade_type_after upgrade_ref2ref_after upgrade_distributed_function_after upgrade_rebalance_strategy_after upgrade_list_citus_objects +test: upgrade_basic_after upgrade_type_after upgrade_ref2ref_after upgrade_distributed_function_after upgrade_rebalance_strategy_after upgrade_list_citus_objects + +# This attempts dropping citus extension (and rollbacks), so please do +# not run in parallel with any other tests. +test: upgrade_columnar_after diff --git a/src/test/regress/expected/upgrade_columnar_after.out b/src/test/regress/expected/upgrade_columnar_after.out index 1129cb6aa..8c5679ff1 100644 --- a/src/test/regress/expected/upgrade_columnar_after.out +++ b/src/test/regress/expected/upgrade_columnar_after.out @@ -141,3 +141,15 @@ SELECT count(*), sum(a), sum(b) FROM test_options_2; 20000 | 100010000 | 65015 (1 row) +BEGIN; + -- Show that we can still drop the extension after upgrading + SET client_min_messages TO WARNING; + -- Drop extension migth cascade to columnar.options before dropping a + -- columnar table. In that case, we were getting below error when opening + -- columnar.options to delete records for the columnar table that we are + -- about to drop.: "ERROR: could not open relation with OID 0". + -- + -- I somehow reproduced this bug easily when upgrading pg, that is why + -- adding the test to this file. + DROP EXTENSION citus CASCADE; +ROLLBACK; diff --git a/src/test/regress/sql/upgrade_columnar_after.sql b/src/test/regress/sql/upgrade_columnar_after.sql index 99cfb0afd..85ff81f7f 100644 --- a/src/test/regress/sql/upgrade_columnar_after.sql +++ b/src/test/regress/sql/upgrade_columnar_after.sql @@ -39,3 +39,16 @@ SELECT * FROM columnar.options WHERE regclass = 'test_options_2'::regclass; VACUUM VERBOSE test_options_2; SELECT count(*), sum(a), sum(b) FROM test_options_2; +BEGIN; + -- Show that we can still drop the extension after upgrading + SET client_min_messages TO WARNING; + + -- Drop extension migth cascade to columnar.options before dropping a + -- columnar table. In that case, we were getting below error when opening + -- columnar.options to delete records for the columnar table that we are + -- about to drop.: "ERROR: could not open relation with OID 0". + -- + -- I somehow reproduced this bug easily when upgrading pg, that is why + -- adding the test to this file. + DROP EXTENSION citus CASCADE; +ROLLBACK;