Add a test for upgrading shard placements

pull/1453/head
Brian Cloutier 2017-07-07 15:18:37 +03:00 committed by Marco Slot
parent ee4edc498f
commit 72d8d2429b
4 changed files with 71 additions and 18 deletions

View File

@ -25,12 +25,23 @@ CREATE INDEX pg_dist_placement_shardid_index
CREATE UNIQUE INDEX pg_dist_placement_placementid_index CREATE UNIQUE INDEX pg_dist_placement_placementid_index
ON pg_dist_placement USING btree(placementid); ON pg_dist_placement USING btree(placementid);
CREATE OR REPLACE FUNCTION citus.find_groupid_for_node(text, int)
RETURNS int AS $$
DECLARE
groupid int := (SELECT groupid FROM pg_dist_node WHERE nodename = $1 AND nodeport = $2);
BEGIN
IF groupid IS NULL THEN
RAISE EXCEPTION 'There is no node at "%:%"', $1, $2;
ELSE
RETURN groupid;
END IF;
END;
$$ LANGUAGE plpgsql;
INSERT INTO pg_catalog.pg_dist_placement INSERT INTO pg_catalog.pg_dist_placement
SELECT placementid, shardid, shardstate, shardlength, node.groupid SELECT placementid, shardid, shardstate, shardlength,
FROM pg_dist_shard_placement placement LEFT JOIN pg_dist_node node ON ( citus.find_groupid_for_node(placement.nodename, placement.nodeport::int) AS groupid
-- use a LEFT JOIN so if the node is missing for some reason we error out FROM pg_dist_shard_placement placement;
placement.nodename = node.nodename AND placement.nodeport = node.nodeport
);
DROP TRIGGER dist_placement_cache_invalidate ON pg_catalog.pg_dist_shard_placement; DROP TRIGGER dist_placement_cache_invalidate ON pg_catalog.pg_dist_shard_placement;
CREATE TRIGGER dist_placement_cache_invalidate CREATE TRIGGER dist_placement_cache_invalidate
@ -58,19 +69,6 @@ GRANT SELECT ON pg_catalog.pg_dist_shard_placement TO public;
ALTER VIEW pg_catalog.pg_dist_shard_placement ALTER VIEW pg_catalog.pg_dist_shard_placement
ALTER placementid SET DEFAULT nextval('pg_dist_placement_placementid_seq'); ALTER placementid SET DEFAULT nextval('pg_dist_placement_placementid_seq');
CREATE OR REPLACE FUNCTION citus.find_groupid_for_node(text, int)
RETURNS int AS $$
DECLARE
groupid int := (SELECT groupid FROM pg_dist_node WHERE nodename = $1 AND nodeport = $2);
BEGIN
IF groupid IS NULL THEN
RAISE EXCEPTION 'There is no node at "%:%"', $1, $2;
ELSE
RETURN groupid;
END IF;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION citus.pg_dist_shard_placement_trigger_func() CREATE OR REPLACE FUNCTION citus.pg_dist_shard_placement_trigger_func()
RETURNS TRIGGER AS $$ RETURNS TRIGGER AS $$
BEGIN BEGIN

View File

@ -0,0 +1,29 @@
ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 103000;
-- tests that the upgrade from 7.0-2 to 7.0-3 properly migrates shard placements
DROP EXTENSION citus;
SET citus.enable_version_checks TO 'false';
CREATE EXTENSION citus VERSION '7.0-2';
INSERT INTO pg_dist_shard_placement
(placementid, shardid, shardstate, shardlength, nodename, nodeport) VALUES
(1, 1, 1, 0, 'localhost', :worker_1_port);
-- if there are no worker nodes which match the shards this should fail
ALTER EXTENSION citus UPDATE TO '7.0-3';
ERROR: There is no node at "localhost:57637"
CONTEXT: PL/pgSQL function citus.find_groupid_for_node(text,integer) line 6 at RAISE
-- if you add a matching worker the upgrade should succeed
SELECT master_add_node('localhost', :worker_1_port);
master_add_node
-----------------------------------
(1,1,localhost,57637,default,f,t)
(1 row)
ALTER EXTENSION citus UPDATE TO '7.0-3';
SELECT * FROM pg_dist_placement;
placementid | shardid | shardstate | shardlength | groupid
-------------+---------+------------+-------------+---------
1 | 1 | 1 | 0 | 1
(1 row)
-- reset and prepare for the rest of the tests
DROP EXTENSION citus;
CREATE EXTENSION citus;

View File

@ -16,6 +16,7 @@
# Tests around schema changes, these are run first, so there's no preexisting objects. # Tests around schema changes, these are run first, so there's no preexisting objects.
# --- # ---
test: multi_extension test: multi_extension
test: multi_703_upgrade
test: multi_cluster_management test: multi_cluster_management
test: multi_test_helpers test: multi_test_helpers
test: multi_table_ddl test: multi_table_ddl

View File

@ -0,0 +1,25 @@
ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 103000;
-- tests that the upgrade from 7.0-2 to 7.0-3 properly migrates shard placements
DROP EXTENSION citus;
SET citus.enable_version_checks TO 'false';
CREATE EXTENSION citus VERSION '7.0-2';
INSERT INTO pg_dist_shard_placement
(placementid, shardid, shardstate, shardlength, nodename, nodeport) VALUES
(1, 1, 1, 0, 'localhost', :worker_1_port);
-- if there are no worker nodes which match the shards this should fail
ALTER EXTENSION citus UPDATE TO '7.0-3';
-- if you add a matching worker the upgrade should succeed
SELECT master_add_node('localhost', :worker_1_port);
ALTER EXTENSION citus UPDATE TO '7.0-3';
SELECT * FROM pg_dist_placement;
-- reset and prepare for the rest of the tests
DROP EXTENSION citus;
CREATE EXTENSION citus;