diff --git a/src/backend/distributed/metadata/metadata_sync.c b/src/backend/distributed/metadata/metadata_sync.c index 631f18c8f..9fb722251 100644 --- a/src/backend/distributed/metadata/metadata_sync.c +++ b/src/backend/distributed/metadata/metadata_sync.c @@ -111,6 +111,15 @@ start_metadata_sync_to_node(PG_FUNCTION_ARGS) MarkNodeHasMetadata(nodeNameString, nodePort, true); + if (!WorkerNodeIsPrimary(workerNode)) + { + /* + * If this is a secondary node we can't actually sync metadata to it; we assume + * the primary node is receiving metadata. + */ + PG_RETURN_VOID(); + } + /* generate and add the local group id's update query */ localGroupIdUpdateCommand = LocalGroupIdUpdateCommand(workerNode->groupId); diff --git a/src/test/regress/expected/multi_metadata_sync.out b/src/test/regress/expected/multi_metadata_sync.out index 4d364178a..6e18a9127 100644 --- a/src/test/regress/expected/multi_metadata_sync.out +++ b/src/test/regress/expected/multi_metadata_sync.out @@ -175,6 +175,38 @@ SELECT count(*) FROM pg_dist_node WHERE hasmetadata=true; 0 (1 row) +-- Ensure it works when run on a secondary node +SELECT groupid AS worker_1_group FROM pg_dist_node WHERE nodeport = :worker_1_port \gset +SELECT master_add_node('localhost', 8888, groupid => :worker_1_group, noderole => 'secondary'); + master_add_node +-------------------------------------------- + (4,1,localhost,8888,default,f,t,secondary) +(1 row) + +SELECT start_metadata_sync_to_node('localhost', 8888); + start_metadata_sync_to_node +----------------------------- + +(1 row) + +SELECT hasmetadata FROM pg_dist_node WHERE nodeport = 8888; + hasmetadata +------------- + t +(1 row) + +SELECT stop_metadata_sync_to_node('localhost', 8888); + stop_metadata_sync_to_node +---------------------------- + +(1 row) + +SELECT hasmetadata FROM pg_dist_node WHERE nodeport = 8888; + hasmetadata +------------- + f +(1 row) + -- Run start_metadata_sync_to_node and check that it marked hasmetadata for that worker SELECT start_metadata_sync_to_node('localhost', :worker_1_port); start_metadata_sync_to_node @@ -1131,7 +1163,7 @@ SELECT create_distributed_table('mx_table', 'a'); SELECT master_add_node('localhost', :worker_2_port); master_add_node ------------------------------------------- - (4,4,localhost,57638,default,f,t,primary) + (5,4,localhost,57638,default,f,t,primary) (1 row) SELECT start_metadata_sync_to_node('localhost', :worker_2_port); @@ -1344,7 +1376,7 @@ SELECT master_add_node('localhost', :worker_2_port); NOTICE: Replicating reference table "mx_ref" to the node localhost:57638 master_add_node ------------------------------------------- - (5,5,localhost,57638,default,f,t,primary) + (6,5,localhost,57638,default,f,t,primary) (1 row) SELECT shardid, nodename, nodeport diff --git a/src/test/regress/sql/multi_metadata_sync.sql b/src/test/regress/sql/multi_metadata_sync.sql index eb49ec52b..02ad8981a 100644 --- a/src/test/regress/sql/multi_metadata_sync.sql +++ b/src/test/regress/sql/multi_metadata_sync.sql @@ -67,6 +67,14 @@ SELECT unnest(master_metadata_snapshot()); -- Ensure that hasmetadata=false for all nodes SELECT count(*) FROM pg_dist_node WHERE hasmetadata=true; +-- Ensure it works when run on a secondary node +SELECT groupid AS worker_1_group FROM pg_dist_node WHERE nodeport = :worker_1_port \gset +SELECT master_add_node('localhost', 8888, groupid => :worker_1_group, noderole => 'secondary'); +SELECT start_metadata_sync_to_node('localhost', 8888); +SELECT hasmetadata FROM pg_dist_node WHERE nodeport = 8888; +SELECT stop_metadata_sync_to_node('localhost', 8888); +SELECT hasmetadata FROM pg_dist_node WHERE nodeport = 8888; + -- Run start_metadata_sync_to_node and check that it marked hasmetadata for that worker SELECT start_metadata_sync_to_node('localhost', :worker_1_port); SELECT nodeid, hasmetadata FROM pg_dist_node WHERE nodename='localhost' AND nodeport=:worker_1_port;