diff --git a/src/backend/distributed/metadata/node_metadata.c b/src/backend/distributed/metadata/node_metadata.c index 82c1f42fd..674831dcc 100644 --- a/src/backend/distributed/metadata/node_metadata.c +++ b/src/backend/distributed/metadata/node_metadata.c @@ -510,6 +510,10 @@ citus_disable_node(PG_FUNCTION_ARGS) workerNode->workerName, nodePort))); } + + bool forceRemoteDelete = false; + DeleteAllReplicatedTablePlacementsFromNodeGroup(workerNode->groupId, + forceRemoteDelete); } TransactionModifiedNodeMetadata = true; @@ -1180,11 +1184,22 @@ ActivateNode(char *nodeName, int nodePort) ereport(ERROR, (errmsg("node at \"%s:%u\" does not exist", nodeName, nodePort))); } + /* + * Delete replicated table placements from the coordinator's metadata, + * including remote ones if the node is inactive primary worker node. + */ + if (!NodeIsCoordinator(workerNode) && NodeIsPrimary(workerNode) && !workerNode->isActive) + { +; bool forceRemoteDelete = true; + DeleteAllReplicatedTablePlacementsFromNodeGroup(workerNode->groupId, + forceRemoteDelete); + } + workerNode = SetWorkerColumnLocalOnly(workerNode, Anum_pg_dist_node_isactive, BoolGetDatum(isActive)); - bool syncMetadata = - EnableMetadataSyncByDefault && NodeIsPrimary(workerNode); + + bool syncMetadata = EnableMetadataSyncByDefault && NodeIsPrimary(workerNode); if (syncMetadata) { @@ -1196,17 +1211,6 @@ ActivateNode(char *nodeName, int nodePort) BoolGetDatum(isActive)); } - /* - * Delete replicated table placements from the coordinator's metadata, - * including remote ones. - */ - if (syncMetadata && !NodeIsCoordinator(workerNode) && NodeIsPrimary(workerNode)) - { - bool forceRemoteDelete = true; - DeleteAllReplicatedTablePlacementsFromNodeGroup(workerNode->groupId, - forceRemoteDelete); - } - SetUpDistributedTableWithDependencies(workerNode); if (syncMetadata) diff --git a/src/test/regress/input/multi_copy.source b/src/test/regress/input/multi_copy.source index dfd094943..66a06ad05 100644 --- a/src/test/regress/input/multi_copy.source +++ b/src/test/regress/input/multi_copy.source @@ -468,8 +468,10 @@ SELECT shardid, nodename, nodeport -- disable the first node SET client_min_messages TO ERROR; \set VERBOSITY terse +table pg_dist_node; SELECT master_disable_node('localhost', :worker_1_port); SELECT public.wait_until_metadata_sync(30000); +table pg_dist_node; RESET client_min_messages; \set VERBOSITY default @@ -481,6 +483,7 @@ SET citus.shard_replication_factor TO 1; -- add two new shards and verify they are created at the other node SELECT master_create_empty_shard('numbers_append') AS shardid1 \gset SELECT master_create_empty_shard('numbers_append') AS shardid2 \gset +table pg_dist_node; COPY numbers_append FROM STDIN WITH (FORMAT 'csv', append_to_shard :shardid1); 5,7 @@ -497,8 +500,16 @@ SELECT shardid, nodename, nodeport WHERE logicalrelid = 'numbers_append'::regclass order by placementid; -- add the node back -SET client_min_messages TO ERROR; +table pg_dist_node; +\c - - - :worker_1_port +table pg_dist_node; +table pg_dist_placement; +table pg_dist_shard; +table pg_dist_shard_placement; +\c - - - :master_port +set citus.log_remote_commands to true; SELECT 1 FROM master_activate_node('localhost', :worker_1_port); +reset citus.log_remote_commands; RESET client_min_messages; RESET citus.shard_replication_factor; -- add two new shards and verify they are created at both workers diff --git a/src/test/regress/sql/failure_mx_metadata_sync.sql b/src/test/regress/sql/failure_mx_metadata_sync.sql index 171d49a1a..16fcb8dad 100644 --- a/src/test/regress/sql/failure_mx_metadata_sync.sql +++ b/src/test/regress/sql/failure_mx_metadata_sync.sql @@ -20,34 +20,34 @@ SELECT hasmetadata FROM pg_dist_node WHERE nodeport=:worker_2_proxy_port; -- Failure to set groupid in the worker SELECT citus.mitmproxy('conn.onQuery(query="^UPDATE pg_dist_local_group SET groupid").cancel(' || :pid || ')'); -SELECT start_metadata_sync_to_node('localhost', :worker_2_proxy_port); +SELECT citus_activate_node('localhost', :worker_2_proxy_port); SELECT citus.mitmproxy('conn.onQuery(query="^UPDATE pg_dist_local_group SET groupid").kill()'); -SELECT start_metadata_sync_to_node('localhost', :worker_2_proxy_port); +SELECT citus_activate_node('localhost', :worker_2_proxy_port); -- Failure to drop all tables in pg_dist_partition SELECT citus.mitmproxy('conn.onQuery(query="^SELECT worker_drop_distributed_table").cancel(' || :pid || ')'); -SELECT start_metadata_sync_to_node('localhost', :worker_2_proxy_port); +SELECT citus_activate_node('localhost', :worker_2_proxy_port); SELECT citus.mitmproxy('conn.onQuery(query="^SELECT worker_drop_distributed_table").kill()'); -SELECT start_metadata_sync_to_node('localhost', :worker_2_proxy_port); +SELECT citus_activate_node('localhost', :worker_2_proxy_port); -- Failure to truncate pg_dist_node in the worker SELECT citus.mitmproxy('conn.onQuery(query="^TRUNCATE pg_dist_node CASCADE").cancel(' || :pid || ')'); -SELECT start_metadata_sync_to_node('localhost', :worker_2_proxy_port); +SELECT citus_activate_node('localhost', :worker_2_proxy_port); SELECT citus.mitmproxy('conn.onQuery(query="^TRUNCATE pg_dist_node CASCADE").kill()'); -SELECT start_metadata_sync_to_node('localhost', :worker_2_proxy_port); +SELECT citus_activate_node('localhost', :worker_2_proxy_port); -- Failure to populate pg_dist_node in the worker SELECT citus.mitmproxy('conn.onQuery(query="^INSERT INTO pg_dist_node").cancel(' || :pid || ')'); -SELECT start_metadata_sync_to_node('localhost', :worker_2_proxy_port); +SELECT citus_activate_node('localhost', :worker_2_proxy_port); SELECT citus.mitmproxy('conn.onQuery(query="^INSERT INTO pg_dist_node").kill()'); -SELECT start_metadata_sync_to_node('localhost', :worker_2_proxy_port); +SELECT citus_activate_node('localhost', :worker_2_proxy_port); -- Verify that coordinator knows worker does not have valid metadata SELECT hasmetadata FROM pg_dist_node WHERE nodeport=:worker_2_proxy_port; -- Verify we can sync metadata after unsuccessful attempts SELECT citus.mitmproxy('conn.allow()'); -SELECT start_metadata_sync_to_node('localhost', :worker_2_proxy_port); +SELECT citus_activate_node('localhost', :worker_2_proxy_port); SELECT hasmetadata FROM pg_dist_node WHERE nodeport=:worker_2_proxy_port; -- Check failures on DDL command propagation @@ -98,7 +98,7 @@ SELECT count(*) FROM pg_dist_node; SELECT hasmetadata FROM pg_dist_node WHERE nodeport=:worker_2_proxy_port; -- turn metadata sync back on -SELECT start_metadata_sync_to_node('localhost', :worker_2_proxy_port); +SELECT citus_activate_node('localhost', :worker_2_proxy_port); SET SEARCH_PATH = mx_metadata_sync; DROP TABLE t1; diff --git a/src/test/regress/sql/multi_drop_extension.sql b/src/test/regress/sql/multi_drop_extension.sql index 7df4a19c0..3ac64507a 100644 --- a/src/test/regress/sql/multi_drop_extension.sql +++ b/src/test/regress/sql/multi_drop_extension.sql @@ -76,8 +76,10 @@ CREATE OR REPLACE FUNCTION pg_catalog.master_create_worker_shards(table_name tex AS 'citus', $$master_create_worker_shards$$ LANGUAGE C STRICT; -- re-add the nodes to the cluster +set citus.log_remote_commands to true; SELECT 1 FROM master_add_node('localhost', :worker_1_port); SELECT 1 FROM master_add_node('localhost', :worker_2_port); +reset citus.log_remote_commands; -- verify that a table can be created after the extension has been dropped and recreated CREATE TABLE testtableddl(somecol int, distributecol text NOT NULL); diff --git a/src/test/regress/sql/multi_index_statements.sql b/src/test/regress/sql/multi_index_statements.sql index f920adb0a..6c22a8403 100644 --- a/src/test/regress/sql/multi_index_statements.sql +++ b/src/test/regress/sql/multi_index_statements.sql @@ -107,7 +107,7 @@ DROP TABLE local_table; -- Verify that all indexes got created on the master node and one of the workers SELECT * FROM pg_indexes WHERE tablename = 'lineitem' or tablename like 'index_test_%' ORDER BY indexname; \c - - - :worker_1_port -SELECT * FROM pg_indexes WHERE tablename LIKE 'lineitem_%'; +SELECT count(*) FROM pg_indexes WHERE tablename = (SELECT relname FROM pg_class WHERE relname LIKE 'lineitem_%' ORDER BY relname LIMIT 1); SELECT count(*) FROM pg_indexes WHERE tablename LIKE 'index_test_hash_%'; SELECT count(*) FROM pg_indexes WHERE tablename LIKE 'index_test_range_%'; SELECT count(*) FROM pg_indexes WHERE tablename LIKE 'index_test_append_%'; @@ -189,7 +189,7 @@ SELECT indrelid::regclass, indexrelid::regclass FROM pg_index WHERE indrelid = ( SELECT * FROM pg_indexes WHERE tablename LIKE 'index_test_%' ORDER BY indexname; \c - - - :worker_1_port SET citus.override_table_visibility TO FALSE; -SELECT indrelid::regclass, indexrelid::regclass FROM pg_index WHERE indrelid = (SELECT relname FROM pg_class WHERE relname SIMILAR TO 'lineitem_360000' ORDER BY relname LIMIT 1)::regclass AND NOT indisprimary AND indexrelid::regclass::text NOT LIKE 'lineitem_time_index%' ORDER BY 1,2; +SELECT indrelid::regclass, indexrelid::regclass FROM pg_index WHERE indrelid = (SELECT relname FROM pg_class WHERE relname SIMILAR TO 'lineitem%\d' ORDER BY relname LIMIT 1)::regclass AND NOT indisprimary AND indexrelid::regclass::text NOT LIKE 'lineitem_time_index%' ORDER BY 1,2; SELECT * FROM pg_indexes WHERE tablename SIMILAR TO 'index_test_%\d' ORDER BY indexname; -- create index that will conflict with master operations