Fix upgrade & downgrade errors

pull/5911/head
Yanwen Jin 2022-06-08 17:16:36 -07:00
parent 1f9fb0511c
commit 64e1ec7488
12 changed files with 114 additions and 44 deletions

View File

@ -1013,6 +1013,19 @@ CreateExtensionWithVersion(char *extname, char *extVersion)
}
/*
* GetExtensionVersionNumber convert extension version to real value
*/
double
GetExtensionVersionNumber(char *extVersion)
{
char *strtokPosition = NULL;
char *versionVal = strtok_r(extVersion, "-", &strtokPosition);
double versionNumber = strtod(versionVal, NULL);
return versionNumber;
}
/*
* AlterExtensionUpdateStmt builds and execute Alter extension statements
* per given extension name and updates extension verision

View File

@ -211,13 +211,13 @@ multi_ProcessUtility(PlannedStmt *pstmt,
if (newVersionValue)
{
const char *newVersion = defGetString(newVersionValue);
const char schemaVersionSeparator = '-';
char *leftSeperatorPosition = strchr(newVersion, schemaVersionSeparator);
versionNumber = strtod(leftSeperatorPosition, NULL);
const char *newVersion = strdup(defGetString(newVersionValue));
char *strtokPosition = NULL;
char *versionVal = strtok_r(newVersion, "-", &strtokPosition);
versionNumber = strtod(versionVal, NULL);
}
if (versionNumber >= 11.1)
if (versionNumber * 100 >= 1110.0)
{
if (get_extension_oid("citus_columnar", true) == InvalidOid)
{
@ -655,19 +655,21 @@ ProcessUtilityInternal(PlannedStmt *pstmt,
((AlterExtensionStmt *) parsetree)->options, "new_version");
Oid citusExtensionOid = get_extension_oid("citus", true);
char *curExtensionVersion = get_extension_version(citusExtensionOid);
double curExtensionNumber = GetExtensionVersionNumber(strdup(
curExtensionVersion));
Oid citusColumnarOid = get_extension_oid("citus_columnar", true);
if (newVersionValue)
{
const char *newVersion = defGetString(newVersionValue);
char *newVersion = defGetString(newVersionValue);
double newVersionNumber = GetExtensionVersionNumber(strdup(newVersion));
/*alter extension citus update to 11.1-1, and no citus_columnar installed */
if (strcmp(newVersion, "11.1-1") == 0 && citusColumnarOid == InvalidOid)
/*alter extension citus update to version >= 11.1-1, and no citus_columnar installed */
if (newVersionNumber * 100 >= 1110 && citusColumnarOid == InvalidOid)
{
/*it's upgrade citus to 11.1-1 */
/*it's upgrade citus to version later or equal to 11.1-1 */
CreateExtensionWithVersion("citus_columnar", "11.1-0");
}
else if (strcmp(curExtensionVersion, "11.1-1") == 0 && citusColumnarOid !=
InvalidOid)
else if (newVersionNumber * 100 < 1110 && citusColumnarOid != InvalidOid)
{
/*downgrade citus_columnar to Y */
AlterExtensionUpdateStmt("citus_columnar", "11.1-0");
@ -676,7 +678,7 @@ ProcessUtilityInternal(PlannedStmt *pstmt,
else
{
double versionNumber = strtod(CITUS_MAJORVERSION, NULL);
if (versionNumber >= 11.1)
if (versionNumber * 100 >= 1110)
{
if (citusColumnarOid == InvalidOid)
{
@ -696,8 +698,9 @@ ProcessUtilityInternal(PlannedStmt *pstmt,
Oid citusColumnarOid = get_extension_oid("citus_columnar", true);
if (newVersionValue)
{
const char *newVersion = defGetString(newVersionValue);
if (strcmp(newVersion, "11.1-1") == 0 && citusColumnarOid != InvalidOid)
char *newVersion = defGetString(newVersionValue);
double newVersionNumber = GetExtensionVersionNumber(strdup(newVersion));
if (newVersionNumber * 100 >= 1110 && citusColumnarOid != InvalidOid)
{
/*after "ALTER EXTENSION citus" updates citus_columnar Y to version Z. */
char *curColumnarVersion = get_extension_version(citusColumnarOid);
@ -706,8 +709,7 @@ ProcessUtilityInternal(PlannedStmt *pstmt,
AlterExtensionUpdateStmt("citus_columnar", "11.1-1");
}
}
else if (strcmp(newVersion, "11.0-2") == 0 && citusColumnarOid !=
InvalidOid)
else if (newVersionNumber * 100 < 1110 && citusColumnarOid != InvalidOid)
{
/*after "ALTER EXTENSION citus" drops citus_columnar extension */
char *curColumnarVersion = get_extension_version(citusColumnarOid);
@ -720,7 +722,7 @@ ProcessUtilityInternal(PlannedStmt *pstmt,
else
{
double versionNumber = strtod(CITUS_MAJORVERSION, NULL);
if (versionNumber >= 11.1)
if (versionNumber * 100 >= 1110)
{
char *curColumnarVersion = get_extension_version(citusColumnarOid);
if (strcmp(curColumnarVersion, "11.1-0") == 0)

View File

@ -1,12 +1,18 @@
-- citus--10.0-1--10.0-2
--#include "../../columnar/sql/columnar--10.0-1--10.0-2.sql"
DO $$ begin raise log '%', 'begin 10.0-1--10.0-2'; end; $$;
DO $check_columnar$
BEGIN
IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') THEN
IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e
INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid)
INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid)
WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler'
) THEN
#include "../../columnar/sql/columnar--10.0-1--10.0-2.sql"
END IF;
END;
$check_columnar$;
GRANT SELECT ON public.citus_tables TO public;
DO $$ begin raise log '%', ' 10.0-1--10.0-2'; end; $$;

View File

@ -3,6 +3,7 @@
-- add the current database to the distributed objects if not already in there.
-- this is to reliably propagate some of the alter database commands that might be
-- supported.
INSERT INTO citus.pg_dist_object SELECT
'pg_catalog.pg_database'::regclass::oid AS oid,
(SELECT oid FROM pg_database WHERE datname = current_database()) as objid,
@ -12,7 +13,11 @@ ON CONFLICT DO NOTHING;
--#include "../../columnar/sql/columnar--10.0-3--10.1-1.sql"
DO $check_columnar$
BEGIN
IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') THEN
IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e
INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid)
INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid)
WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler'
) THEN
#include "../../columnar/sql/columnar--10.0-3--10.1-1.sql"
END IF;
END;
@ -55,4 +60,5 @@ WHERE repmodel = 'c'
DROP TRIGGER pg_dist_rebalance_strategy_enterprise_check_trigger ON pg_catalog.pg_dist_rebalance_strategy;
DROP FUNCTION citus_internal.pg_dist_rebalance_strategy_enterprise_check();
DO $$ begin raise log '%', '10.0-4--10.1-1'; end; $$;
#include "udfs/citus_cleanup_orphaned_shards/10.1-1.sql"

View File

@ -12,7 +12,11 @@ ALTER TABLE pg_catalog.pg_dist_placement ADD CONSTRAINT placement_shardid_groupi
--#include "../../columnar/sql/columnar--10.1-1--10.2-1.sql"
DO $check_columnar$
BEGIN
IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') THEN
IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e
INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid)
INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid)
WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler'
) THEN
#include "../../columnar/sql/columnar--10.1-1--10.2-1.sql"
END IF;
END;
@ -29,6 +33,8 @@ $check_columnar$;
#include "udfs/get_missing_time_partition_ranges/10.2-1.sql"
#include "udfs/worker_nextval/10.2-1.sql"
DO $$ begin raise log '%', 'begin 10.1-1--10.2-1'; end; $$;
DROP FUNCTION pg_catalog.citus_drop_all_shards(regclass, text, text);
CREATE FUNCTION pg_catalog.citus_drop_all_shards(logicalrelid regclass,
schema_name text,
@ -42,3 +48,4 @@ COMMENT ON FUNCTION pg_catalog.citus_drop_all_shards(regclass, text, text, boole
#include "udfs/citus_drop_trigger/10.2-1.sql";
#include "udfs/citus_prepare_pg_upgrade/10.2-1.sql"
#include "udfs/citus_finish_pg_upgrade/10.2-1.sql"
DO $$ begin raise log '%', '10.1-1--10.2-1'; end; $$;

View File

@ -3,10 +3,16 @@
-- bump version to 10.2-2
--#include "../../columnar/sql/columnar--10.2-1--10.2-2.sql"
DO $$ begin raise log '%', 'begin 10.2-1--10.2-2'; end; $$;
DO $check_columnar$
BEGIN
IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') THEN
IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e
INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid)
INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid)
WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler'
) THEN
#include "../../columnar/sql/columnar--10.2-1--10.2-2.sql"
END IF;
END;
$check_columnar$;
DO $$ begin raise log '%', '10.2-1--10.2-2'; end; $$;

View File

@ -5,7 +5,11 @@
--#include "../../columnar/sql/columnar--10.2-2--10.2-3.sql"
DO $check_columnar$
BEGIN
IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') THEN
IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e
INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid)
INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid)
WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler'
) THEN
#include "../../columnar/sql/columnar--10.2-2--10.2-3.sql"
END IF;
END;

View File

@ -3,11 +3,16 @@
-- bump version to 10.2-4
--#include "../../columnar/sql/columnar--10.2-3--10.2-4.sql"
DO $$ begin raise log '%', 'begin 10.2-3--10.2-4'; end; $$;
DO $check_columnar$
BEGIN
IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') THEN
IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e
INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid)
INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid)
WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler'
) THEN
#include "../../columnar/sql/columnar--10.2-3--10.2-4.sql"
END IF;
END IF;
END;
$check_columnar$;
@ -15,3 +20,4 @@ $check_columnar$;
#include "udfs/fix_all_partition_shard_index_names/10.2-4.sql"
#include "udfs/worker_fix_partition_shard_index_names/10.2-4.sql"
#include "udfs/citus_finish_pg_upgrade/10.2-4.sql"
DO $$ begin raise log '%', '10.2-3--10.2-4'; end; $$;

View File

@ -6,7 +6,7 @@
-- cat citus--9.5-1--10.0-1.sql citus--10.0-1--10.0-2.sql citus--10.0-2--10.0-3.sql > citus--9.5-1--10.0-4.sql
-- copy of citus--9.5-1--10.0-1
DO $$ begin raise log '%', 'begin 9.5-1--10.0-4'; end; $$;
DROP FUNCTION pg_catalog.upgrade_to_reference_table(regclass);
DROP FUNCTION IF EXISTS pg_catalog.citus_total_relation_size(regclass);
@ -38,9 +38,13 @@ DROP FUNCTION IF EXISTS pg_catalog.citus_total_relation_size(regclass);
--#include "../../columnar/sql/columnar--9.5-1--10.0-1.sql"
DO $check_columnar$
BEGIN
IF NOT EXISTS (select 1 from pg_extension where extname='citus_columnar') THEN
#include "../../columnar/sql/columnar--9.5-1--10.0-1.sql"
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e
INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid)
INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid)
WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler'
) THEN
#include "../../columnar/sql/columnar--9.5-1--10.0-1.sql"
END IF;
END;
$check_columnar$;
@ -179,7 +183,19 @@ GRANT SELECT ON pg_catalog.citus_worker_stat_activity TO PUBLIC;
-- copy of citus--10.0-1--10.0-2
--#include "../../columnar/sql/columnar--10.0-1--10.0-2.sql"
DO $check_columnar$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_extension AS e
INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid)
INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid)
WHERE e.extname='citus_columnar' and p.proname = 'columnar_handler'
) THEN
#include "../../columnar/sql/columnar--10.0-1--10.0-2.sql"
END IF;
END;
$check_columnar$;
-- copy of citus--10.0-2--10.0-3
@ -222,3 +238,4 @@ COMMENT ON FUNCTION pg_catalog.citus_get_active_worker_nodes()
RESET search_path;
DO $$ begin raise log '%', ' 9.5-1--10.0-4'; end; $$;

View File

@ -207,6 +207,7 @@ extern ObjectAddress AlterExtensionUpdateStmtObjectAddress(Node *stmt,
bool missing_ok);
extern void CreateExtensionWithVersion(char *extname, char *extVersion);
extern void AlterExtensionUpdateStmt(char *extname, char *extVersion);
extern double GetExtensionVersionNumber(char *extVersion);
/* foreign_constraint.c - forward declarations */
extern bool ConstraintIsAForeignKeyToReferenceTable(char *constraintName,

View File

@ -103,6 +103,7 @@ ORDER BY 1, 2;
-- DROP EXTENSION pre-created by the regression suite
DROP EXTENSION citus;
DROP EXTENSION citus_columnar;
\c
-- these tests switch between citus versions and call ddl's that require pg_dist_object to be created
SET citus.enable_metadata_sync TO 'false';
@ -1054,6 +1055,12 @@ ALTER EXTENSION citus UPDATE TO '11.1-1';
SELECT * FROM multi_extension.print_extension_changes();
previous_object | current_object
---------------------------------------------------------------------
access method columnar |
function alter_columnar_table_reset(regclass,boolean,boolean,boolean,boolean) void |
function alter_columnar_table_set(regclass,integer,integer,name,integer) void |
function citus_internal.columnar_ensure_am_depends_catalog() void |
function citus_internal.downgrade_columnar_storage(regclass) void |
function citus_internal.upgrade_columnar_storage(regclass) void |
function columnar.columnar_handler(internal) table_am_handler |
function worker_cleanup_job_schema_cache() void |
function worker_create_schema(bigint,text) void |
@ -1063,25 +1070,13 @@ SELECT * FROM multi_extension.print_extension_changes();
function worker_merge_files_into_table(bigint,integer,text[],text[]) void |
function worker_range_partition_table(bigint,integer,text,text,oid,anyarray) void |
function worker_repartition_cleanup(bigint) void |
schema columnar |
sequence columnar.storageid_seq |
table columnar.chunk |
table columnar.chunk_group |
table columnar.options |
table columnar.stripe |
| function columnar.get_storage_id(regclass) bigint
| function columnar_internal.columnar_handler(internal) table_am_handler
| schema columnar_internal
| sequence columnar_internal.storageid_seq
| table columnar_internal.chunk
| table columnar_internal.chunk_group
| table columnar_internal.options
| table columnar_internal.stripe
| view columnar.chunk
| view columnar.chunk_group
| view columnar.options
| view columnar.storage
| view columnar.stripe
(27 rows)
(21 rows)
-- Test downgrade script (result should be empty)
ALTER EXTENSION citus UPDATE TO '11.0-2';
@ -1118,6 +1113,7 @@ ORDER BY 1, 2;
RESET citus.enable_version_checks;
RESET columnar.enable_version_checks;
DROP EXTENSION citus;
DROP EXTENSION citus_columnar;
CREATE EXTENSION citus VERSION '8.0-1';
ERROR: specified version incompatible with loaded Citus library
DETAIL: Loaded library requires 11.1, but 8.0-1 was specified.
@ -1194,11 +1190,13 @@ NOTICE: version "9.1-1" of extension "citus" is already installed
ALTER EXTENSION citus UPDATE;
-- re-create in newest version
DROP EXTENSION citus;
DROP EXTENSION citus_columnar;
\c
CREATE EXTENSION citus;
-- test cache invalidation in workers
\c - - - :worker_1_port
DROP EXTENSION citus;
DROP EXTENSION citus_columnar;
SET citus.enable_version_checks TO 'false';
SET columnar.enable_version_checks TO 'false';
CREATE EXTENSION citus VERSION '8.0-1';

View File

@ -98,6 +98,7 @@ ORDER BY 1, 2;
-- DROP EXTENSION pre-created by the regression suite
DROP EXTENSION citus;
DROP EXTENSION citus_columnar;
\c
-- these tests switch between citus versions and call ddl's that require pg_dist_object to be created
@ -497,6 +498,7 @@ ORDER BY 1, 2;
RESET citus.enable_version_checks;
RESET columnar.enable_version_checks;
DROP EXTENSION citus;
DROP EXTENSION citus_columnar;
CREATE EXTENSION citus VERSION '8.0-1';
-- Test non-distributed queries work even in version mismatch
@ -561,6 +563,7 @@ ALTER EXTENSION citus UPDATE;
-- re-create in newest version
DROP EXTENSION citus;
DROP EXTENSION citus_columnar;
\c
CREATE EXTENSION citus;
@ -568,6 +571,7 @@ CREATE EXTENSION citus;
\c - - - :worker_1_port
DROP EXTENSION citus;
DROP EXTENSION citus_columnar;
SET citus.enable_version_checks TO 'false';
SET columnar.enable_version_checks TO 'false';
CREATE EXTENSION citus VERSION '8.0-1';