-- removing coordinator from pg_dist_node should update pg_dist_colocation SELECT master_remove_node('localhost', :master_port); master_remove_node --------------------------------------------------------------------- (1 row) -- to silence -potentially flaky- "could not establish connection after" warnings in below test SET client_min_messages TO ERROR; -- to fail fast when the hostname is not resolvable, as it will be the case below SET citus.node_connection_timeout to '1s'; BEGIN; SET application_name TO 'new_app_name'; -- that should fail because of bad hostname & port SELECT citus_add_node('200.200.200.200', 1, 200); ERROR: connection to the remote node postgres@200.200.200.200:1 failed -- Since above command failed, now Postgres will need to revert the -- application_name change made in this transaction and this will -- happen within abort-transaction callback, so we won't be in a -- transaction block while Postgres does that. -- -- And when the application_name changes, Citus tries to re-assign -- the global pid but it does so only for Citus internal backends, -- and doing so for Citus internal backends doesn't require being -- in a transaction block and is safe. -- -- However, for the client external backends (like us here), Citus -- doesn't re-assign the global pid because it's not needed and it's -- not safe to do so outside of a transaction block. This is because, -- it would require performing a catalog access to retrive the local -- node id when the cached local node is invalidated like what just -- happened here because of the failed citus_add_node() call made -- above. -- -- So by failing here (rather than crashing), we ensure this behavior. ROLLBACK; RESET client_min_messages; RESET citus.node_connection_timeout; -- restore coordinator for the rest of the tests SELECT citus_set_coordinator_host('localhost', :master_port); citus_set_coordinator_host --------------------------------------------------------------------- (1 row)