Global PID Helper Functions (#5768)

* Introduces citus_nodename_for_nodeid and citus_nodeport_for_nodeid functions

* Introduces citus_nodeid_for_gpid and citus_pid_for_gpid functions

* Add tests
velioglu/cyclic_dep_2^2
Halil Ozan Akgül 2022-03-09 13:15:59 +03:00 committed by GitHub
parent 264cf78842
commit 333bcc7948
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 319 additions and 49 deletions

View File

@ -146,6 +146,8 @@ PG_FUNCTION_INFO_V1(master_activate_node);
PG_FUNCTION_INFO_V1(citus_update_node);
PG_FUNCTION_INFO_V1(master_update_node);
PG_FUNCTION_INFO_V1(get_shard_id_for_distribution_column);
PG_FUNCTION_INFO_V1(citus_nodename_for_nodeid);
PG_FUNCTION_INFO_V1(citus_nodeport_for_nodeid);
/*
@ -1473,6 +1475,50 @@ get_shard_id_for_distribution_column(PG_FUNCTION_ARGS)
}
/*
* citus_nodename_for_nodeid returns the node name for the node with given node id
*/
Datum
citus_nodename_for_nodeid(PG_FUNCTION_ARGS)
{
CheckCitusVersion(ERROR);
int nodeId = PG_GETARG_INT32(0);
bool missingOk = true;
WorkerNode *node = FindNodeWithNodeId(nodeId, missingOk);
if (node == NULL)
{
PG_RETURN_NULL();
}
PG_RETURN_TEXT_P(cstring_to_text(node->workerName));
}
/*
* citus_nodeport_for_nodeid returns the node port for the node with given node id
*/
Datum
citus_nodeport_for_nodeid(PG_FUNCTION_ARGS)
{
CheckCitusVersion(ERROR);
int nodeId = PG_GETARG_INT32(0);
bool missingOk = true;
WorkerNode *node = FindNodeWithNodeId(nodeId, missingOk);
if (node == NULL)
{
PG_RETURN_NULL();
}
PG_RETURN_INT32(node->workerPort);
}
/*
* FindWorkerNode searches over the worker nodes and returns the workerNode
* if it already exists. Else, the function returns NULL.
@ -1550,21 +1596,21 @@ FindWorkerNodeAnyCluster(const char *nodeName, int32 nodePort)
WorkerNode *
FindNodeWithNodeId(int nodeId, bool missingOk)
{
List *workerList = ActiveReadableNodeList();
WorkerNode *workerNode = NULL;
List *nodeList = ActiveReadableNodeList();
WorkerNode *node = NULL;
foreach_ptr(workerNode, workerList)
foreach_ptr(node, nodeList)
{
if (workerNode->nodeId == nodeId)
if (node->nodeId == nodeId)
{
return workerNode;
return node;
}
}
/* there isn't any node with nodeId in pg_dist_node */
if (!missingOk)
{
elog(ERROR, "worker node with node id %d could not be found", nodeId);
elog(ERROR, "node with node id %d could not be found", nodeId);
}
return NULL;

View File

@ -94,3 +94,9 @@ ALTER TABLE citus.pg_dist_object SET SCHEMA pg_catalog;
GRANT SELECT ON pg_catalog.pg_dist_object TO public;
#include "udfs/citus_prepare_pg_upgrade/11.0-1.sql"
#include "udfs/citus_finish_pg_upgrade/11.0-1.sql"
#include "udfs/citus_nodename_for_nodeid/11.0-1.sql"
#include "udfs/citus_nodeport_for_nodeid/11.0-1.sql"
#include "udfs/citus_nodeid_for_gpid/11.0-1.sql"
#include "udfs/citus_pid_for_gpid/11.0-1.sql"

View File

@ -361,6 +361,12 @@ DROP FUNCTION get_nodeid_for_groupid(integer);
RESET search_path;
DROP VIEW IF EXISTS pg_catalog.citus_stat_activity;
DROP FUNCTION IF EXISTS pg_catalog.citus_stat_activity;
DROP FUNCTION IF EXISTS pg_catalog.run_command_on_all_nodes;
DROP VIEW pg_catalog.citus_stat_activity;
DROP FUNCTION pg_catalog.citus_stat_activity;
DROP FUNCTION pg_catalog.run_command_on_all_nodes;
DROP FUNCTION pg_catalog.citus_nodename_for_nodeid(integer);
DROP FUNCTION pg_catalog.citus_nodeport_for_nodeid(integer);
DROP FUNCTION pg_catalog.citus_nodeid_for_gpid(bigint);
DROP FUNCTION pg_catalog.citus_pid_for_gpid(bigint);

View File

@ -0,0 +1,7 @@
CREATE OR REPLACE FUNCTION pg_catalog.citus_nodeid_for_gpid(global_pid bigint)
RETURNS integer
LANGUAGE C STABLE STRICT
AS 'MODULE_PATHNAME', $$citus_nodeid_for_gpid$$;
COMMENT ON FUNCTION pg_catalog.citus_nodeid_for_gpid(global_pid bigint)
IS 'returns node id for the global process with given global pid';

View File

@ -0,0 +1,7 @@
CREATE OR REPLACE FUNCTION pg_catalog.citus_nodeid_for_gpid(global_pid bigint)
RETURNS integer
LANGUAGE C STABLE STRICT
AS 'MODULE_PATHNAME', $$citus_nodeid_for_gpid$$;
COMMENT ON FUNCTION pg_catalog.citus_nodeid_for_gpid(global_pid bigint)
IS 'returns node id for the global process with given global pid';

View File

@ -0,0 +1,7 @@
CREATE OR REPLACE FUNCTION pg_catalog.citus_nodename_for_nodeid(nodeid integer)
RETURNS text
LANGUAGE C STABLE STRICT
AS 'MODULE_PATHNAME', $$citus_nodename_for_nodeid$$;
COMMENT ON FUNCTION pg_catalog.citus_nodename_for_nodeid(nodeid integer)
IS 'returns node name for the node with given node id';

View File

@ -0,0 +1,7 @@
CREATE OR REPLACE FUNCTION pg_catalog.citus_nodename_for_nodeid(nodeid integer)
RETURNS text
LANGUAGE C STABLE STRICT
AS 'MODULE_PATHNAME', $$citus_nodename_for_nodeid$$;
COMMENT ON FUNCTION pg_catalog.citus_nodename_for_nodeid(nodeid integer)
IS 'returns node name for the node with given node id';

View File

@ -0,0 +1,7 @@
CREATE OR REPLACE FUNCTION pg_catalog.citus_nodeport_for_nodeid(nodeid integer)
RETURNS integer
LANGUAGE C STABLE STRICT
AS 'MODULE_PATHNAME', $$citus_nodeport_for_nodeid$$;
COMMENT ON FUNCTION pg_catalog.citus_nodeport_for_nodeid(nodeid integer)
IS 'returns node port for the node with given node id';

View File

@ -0,0 +1,7 @@
CREATE OR REPLACE FUNCTION pg_catalog.citus_nodeport_for_nodeid(nodeid integer)
RETURNS integer
LANGUAGE C STABLE STRICT
AS 'MODULE_PATHNAME', $$citus_nodeport_for_nodeid$$;
COMMENT ON FUNCTION pg_catalog.citus_nodeport_for_nodeid(nodeid integer)
IS 'returns node port for the node with given node id';

View File

@ -0,0 +1,7 @@
CREATE OR REPLACE FUNCTION pg_catalog.citus_pid_for_gpid(global_pid bigint)
RETURNS integer
LANGUAGE C STABLE STRICT
AS 'MODULE_PATHNAME', $$citus_pid_for_gpid$$;
COMMENT ON FUNCTION pg_catalog.citus_pid_for_gpid(global_pid bigint)
IS 'returns process id for the global process with given global pid';

View File

@ -0,0 +1,7 @@
CREATE OR REPLACE FUNCTION pg_catalog.citus_pid_for_gpid(global_pid bigint)
RETURNS integer
LANGUAGE C STABLE STRICT
AS 'MODULE_PATHNAME', $$citus_pid_for_gpid$$;
COMMENT ON FUNCTION pg_catalog.citus_pid_for_gpid(global_pid bigint)
IS 'returns process id for the global process with given global pid';

View File

@ -0,0 +1,33 @@
/*-------------------------------------------------------------------------
*
* test/src/global_pid.c
*
* This file contains functions to test the global pid.
*
* Copyright (c) Citus Data, Inc.
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "fmgr.h"
#include "distributed/backend_data.h"
#include "distributed/metadata_cache.h"
PG_FUNCTION_INFO_V1(test_assign_global_pid);
/*
* test_assign_global_pid is the wrapper UDF for AssignGlobalPID and is only meant for use
* in tests.
*/
Datum
test_assign_global_pid(PG_FUNCTION_ARGS)
{
CheckCitusVersion(ERROR);
AssignGlobalPID();
PG_RETURN_VOID();
}

View File

@ -100,6 +100,8 @@ PG_FUNCTION_INFO_V1(get_global_active_transactions);
PG_FUNCTION_INFO_V1(get_all_active_transactions);
PG_FUNCTION_INFO_V1(citus_calculate_gpid);
PG_FUNCTION_INFO_V1(citus_backend_gpid);
PG_FUNCTION_INFO_V1(citus_nodeid_for_gpid);
PG_FUNCTION_INFO_V1(citus_pid_for_gpid);
/*
@ -947,6 +949,35 @@ citus_backend_gpid(PG_FUNCTION_ARGS)
}
/*
* citus_nodeid_for_gpid returns node id for the global process with given global pid
*/
Datum
citus_nodeid_for_gpid(PG_FUNCTION_ARGS)
{
CheckCitusVersion(ERROR);
uint64 globalPID = PG_GETARG_INT64(0);
bool missingOk = false;
PG_RETURN_INT32(ExtractNodeIdFromGlobalPID(globalPID, missingOk));
}
/*
* citus_pid_for_gpid returns process id for the global process with given global pid
*/
Datum
citus_pid_for_gpid(PG_FUNCTION_ARGS)
{
CheckCitusVersion(ERROR);
uint64 globalPID = PG_GETARG_INT64(0);
PG_RETURN_INT32(ExtractProcessIdFromGlobalPID(globalPID));
}
/*
* ExtractGlobalPID extracts the global process id from the application name and returns it
* if the application name is not compatible with Citus' application names returns 0.

View File

@ -88,5 +88,27 @@ SELECT citus_backend_gpid() = citus_calculate_gpid(:coordinator_node_id, pg_back
t
(1 row)
SELECT nodename = citus_nodename_for_nodeid(nodeid) AND nodeport = citus_nodeport_for_nodeid(nodeid)
FROM pg_dist_node
WHERE isactive = true AND noderole = 'primary';
?column?
---------------------------------------------------------------------
t
t
t
(3 rows)
SELECT citus_nodeid_for_gpid(10000000000 * 2 + 3);
citus_nodeid_for_gpid
---------------------------------------------------------------------
2
(1 row)
SELECT citus_pid_for_gpid(10000000000 * 2 + 3);
citus_pid_for_gpid
---------------------------------------------------------------------
3
(1 row)
DROP SCHEMA global_cancel CASCADE;
NOTICE: drop cascades to table global_cancel.dist_table

View File

@ -1,4 +1,25 @@
Parsed test spec with 3 sessions
Parsed test spec with 4 sessions
starting permutation: add-coordinator-to-metadata
create_distributed_table
---------------------------------------------------------------------
(1 row)
step add-coordinator-to-metadata:
SELECT 1 FROM citus_add_node('localhost', 57636, groupid:=0);
SELECT test_assign_global_pid();
?column?
---------------------------------------------------------------------
1
(1 row)
test_assign_global_pid
---------------------------------------------------------------------
(1 row)
starting permutation: s1-cache-connections s1-begin s2-begin s3-begin s1-alter-table s2-sleep s2-view-dist s3-view-worker s2-rollback s1-commit s3-rollback
create_distributed_table
@ -32,32 +53,32 @@ pg_sleep
(1 row)
step s2-view-dist:
SELECT query, state, wait_event_type, wait_event, usename, datname FROM citus_dist_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%BEGIN%'), ('%pg_catalog.pg_isolation_test_session_is_blocked%')) AND backend_type = 'client backend' ORDER BY query DESC;
SELECT query, citus_nodename_for_nodeid(citus_nodeid_for_gpid(global_pid)), citus_nodeport_for_nodeid(citus_nodeid_for_gpid(global_pid)), state, wait_event_type, wait_event, usename, datname FROM citus_dist_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%BEGIN%'), ('%pg_catalog.pg_isolation_test_session_is_blocked%'), ('%citus_add_node%')) AND backend_type = 'client backend' ORDER BY query DESC;
query |state |wait_event_type|wait_event|usename |datname
query |citus_nodename_for_nodeid|citus_nodeport_for_nodeid|state |wait_event_type|wait_event|usename |datname
---------------------------------------------------------------------
ALTER TABLE test_table ADD COLUMN x INT;
|idle in transaction|Client |ClientRead|postgres|regression
|localhost | 57636|idle in transaction|Client |ClientRead|postgres|regression
(1 row)
step s3-view-worker:
SELECT query, state, wait_event_type, wait_event, usename, datname FROM citus_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%csa_from_one_node%')) AND is_worker_query = true AND backend_type = 'client backend' ORDER BY query DESC;
SELECT query, citus_nodename_for_nodeid(citus_nodeid_for_gpid(global_pid)), citus_nodeport_for_nodeid(citus_nodeid_for_gpid(global_pid)), state, wait_event_type, wait_event, usename, datname FROM citus_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%csa_from_one_node%')) AND is_worker_query = true AND backend_type = 'client backend' ORDER BY query DESC;
query |state |wait_event_type|wait_event|usename |datname
query |citus_nodename_for_nodeid|citus_nodeport_for_nodeid|state |wait_event_type|wait_event|usename |datname
---------------------------------------------------------------------
SELECT worker_apply_shard_ddl_command (1300004, 'public', '
SELECT worker_apply_shard_ddl_command (1300009, 'public', '
ALTER TABLE test_table ADD COLUMN x INT;
')|idle in transaction|Client |ClientRead|postgres|regression
SELECT worker_apply_shard_ddl_command (1300003, 'public', '
')|localhost | 57636|idle in transaction|Client |ClientRead|postgres|regression
SELECT worker_apply_shard_ddl_command (1300008, 'public', '
ALTER TABLE test_table ADD COLUMN x INT;
')|idle in transaction|Client |ClientRead|postgres|regression
SELECT worker_apply_shard_ddl_command (1300002, 'public', '
')|localhost | 57636|idle in transaction|Client |ClientRead|postgres|regression
SELECT worker_apply_shard_ddl_command (1300007, 'public', '
ALTER TABLE test_table ADD COLUMN x INT;
')|idle in transaction|Client |ClientRead|postgres|regression
SELECT worker_apply_shard_ddl_command (1300001, 'public', '
')|localhost | 57636|idle in transaction|Client |ClientRead|postgres|regression
SELECT worker_apply_shard_ddl_command (1300006, 'public', '
ALTER TABLE test_table ADD COLUMN x INT;
')|idle in transaction|Client |ClientRead|postgres|regression
')|localhost | 57636|idle in transaction|Client |ClientRead|postgres|regression
(4 rows)
step s2-rollback:
@ -102,21 +123,21 @@ pg_sleep
(1 row)
step s2-view-dist:
SELECT query, state, wait_event_type, wait_event, usename, datname FROM citus_dist_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%BEGIN%'), ('%pg_catalog.pg_isolation_test_session_is_blocked%')) AND backend_type = 'client backend' ORDER BY query DESC;
SELECT query, citus_nodename_for_nodeid(citus_nodeid_for_gpid(global_pid)), citus_nodeport_for_nodeid(citus_nodeid_for_gpid(global_pid)), state, wait_event_type, wait_event, usename, datname FROM citus_dist_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%BEGIN%'), ('%pg_catalog.pg_isolation_test_session_is_blocked%'), ('%citus_add_node%')) AND backend_type = 'client backend' ORDER BY query DESC;
query |state |wait_event_type|wait_event|usename |datname
query |citus_nodename_for_nodeid|citus_nodeport_for_nodeid|state |wait_event_type|wait_event|usename |datname
---------------------------------------------------------------------
INSERT INTO test_table VALUES (100, 100);
|idle in transaction|Client |ClientRead|postgres|regression
|localhost | 57636|idle in transaction|Client |ClientRead|postgres|regression
(1 row)
step s3-view-worker:
SELECT query, state, wait_event_type, wait_event, usename, datname FROM citus_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%csa_from_one_node%')) AND is_worker_query = true AND backend_type = 'client backend' ORDER BY query DESC;
SELECT query, citus_nodename_for_nodeid(citus_nodeid_for_gpid(global_pid)), citus_nodeport_for_nodeid(citus_nodeid_for_gpid(global_pid)), state, wait_event_type, wait_event, usename, datname FROM citus_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%csa_from_one_node%')) AND is_worker_query = true AND backend_type = 'client backend' ORDER BY query DESC;
query |state |wait_event_type|wait_event|usename |datname
query |citus_nodename_for_nodeid|citus_nodeport_for_nodeid|state |wait_event_type|wait_event|usename |datname
---------------------------------------------------------------------
INSERT INTO public.test_table_1300008 (column1, column2) VALUES (100, 100)|idle in transaction|Client |ClientRead|postgres|regression
INSERT INTO public.test_table_1300013 (column1, column2) VALUES (100, 100)|localhost | 57636|idle in transaction|Client |ClientRead|postgres|regression
(1 row)
step s2-rollback:
@ -166,24 +187,24 @@ pg_sleep
(1 row)
step s2-view-dist:
SELECT query, state, wait_event_type, wait_event, usename, datname FROM citus_dist_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%BEGIN%'), ('%pg_catalog.pg_isolation_test_session_is_blocked%')) AND backend_type = 'client backend' ORDER BY query DESC;
SELECT query, citus_nodename_for_nodeid(citus_nodeid_for_gpid(global_pid)), citus_nodeport_for_nodeid(citus_nodeid_for_gpid(global_pid)), state, wait_event_type, wait_event, usename, datname FROM citus_dist_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%BEGIN%'), ('%pg_catalog.pg_isolation_test_session_is_blocked%'), ('%citus_add_node%')) AND backend_type = 'client backend' ORDER BY query DESC;
query |state |wait_event_type|wait_event|usename |datname
query |citus_nodename_for_nodeid|citus_nodeport_for_nodeid|state |wait_event_type|wait_event|usename |datname
---------------------------------------------------------------------
SELECT count(*) FROM test_table;
|idle in transaction|Client |ClientRead|postgres|regression
|localhost | 57636|idle in transaction|Client |ClientRead|postgres|regression
(1 row)
step s3-view-worker:
SELECT query, state, wait_event_type, wait_event, usename, datname FROM citus_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%csa_from_one_node%')) AND is_worker_query = true AND backend_type = 'client backend' ORDER BY query DESC;
SELECT query, citus_nodename_for_nodeid(citus_nodeid_for_gpid(global_pid)), citus_nodeport_for_nodeid(citus_nodeid_for_gpid(global_pid)), state, wait_event_type, wait_event, usename, datname FROM citus_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%csa_from_one_node%')) AND is_worker_query = true AND backend_type = 'client backend' ORDER BY query DESC;
query |state |wait_event_type|wait_event|usename |datname
query |citus_nodename_for_nodeid|citus_nodeport_for_nodeid|state |wait_event_type|wait_event|usename |datname
---------------------------------------------------------------------
SELECT count(*) AS count FROM public.test_table_1300014 test_table WHERE true|idle in transaction|Client |ClientRead|postgres|regression
SELECT count(*) AS count FROM public.test_table_1300013 test_table WHERE true|idle in transaction|Client |ClientRead|postgres|regression
SELECT count(*) AS count FROM public.test_table_1300012 test_table WHERE true|idle in transaction|Client |ClientRead|postgres|regression
SELECT count(*) AS count FROM public.test_table_1300011 test_table WHERE true|idle in transaction|Client |ClientRead|postgres|regression
SELECT count(*) AS count FROM public.test_table_1300019 test_table WHERE true|localhost | 57636|idle in transaction|Client |ClientRead|postgres|regression
SELECT count(*) AS count FROM public.test_table_1300018 test_table WHERE true|localhost | 57636|idle in transaction|Client |ClientRead|postgres|regression
SELECT count(*) AS count FROM public.test_table_1300017 test_table WHERE true|localhost | 57636|idle in transaction|Client |ClientRead|postgres|regression
SELECT count(*) AS count FROM public.test_table_1300016 test_table WHERE true|localhost | 57636|idle in transaction|Client |ClientRead|postgres|regression
(4 rows)
step s2-rollback:
@ -233,21 +254,21 @@ pg_sleep
(1 row)
step s2-view-dist:
SELECT query, state, wait_event_type, wait_event, usename, datname FROM citus_dist_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%BEGIN%'), ('%pg_catalog.pg_isolation_test_session_is_blocked%')) AND backend_type = 'client backend' ORDER BY query DESC;
SELECT query, citus_nodename_for_nodeid(citus_nodeid_for_gpid(global_pid)), citus_nodeport_for_nodeid(citus_nodeid_for_gpid(global_pid)), state, wait_event_type, wait_event, usename, datname FROM citus_dist_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%BEGIN%'), ('%pg_catalog.pg_isolation_test_session_is_blocked%'), ('%citus_add_node%')) AND backend_type = 'client backend' ORDER BY query DESC;
query |state |wait_event_type|wait_event|usename |datname
query |citus_nodename_for_nodeid|citus_nodeport_for_nodeid|state |wait_event_type|wait_event|usename |datname
---------------------------------------------------------------------
SELECT count(*) FROM test_table WHERE column1 = 55;
|idle in transaction|Client |ClientRead|postgres|regression
|localhost | 57636|idle in transaction|Client |ClientRead|postgres|regression
(1 row)
step s3-view-worker:
SELECT query, state, wait_event_type, wait_event, usename, datname FROM citus_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%csa_from_one_node%')) AND is_worker_query = true AND backend_type = 'client backend' ORDER BY query DESC;
SELECT query, citus_nodename_for_nodeid(citus_nodeid_for_gpid(global_pid)), citus_nodeport_for_nodeid(citus_nodeid_for_gpid(global_pid)), state, wait_event_type, wait_event, usename, datname FROM citus_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%csa_from_one_node%')) AND is_worker_query = true AND backend_type = 'client backend' ORDER BY query DESC;
query |state |wait_event_type|wait_event|usename |datname
query |citus_nodename_for_nodeid|citus_nodeport_for_nodeid|state |wait_event_type|wait_event|usename |datname
---------------------------------------------------------------------
SELECT count(*) AS count FROM public.test_table_1300017 test_table WHERE (column1 OPERATOR(pg_catalog.=) 55)|idle in transaction|Client |ClientRead|postgres|regression
SELECT count(*) AS count FROM public.test_table_1300022 test_table WHERE (column1 OPERATOR(pg_catalog.=) 55)|localhost | 57636|idle in transaction|Client |ClientRead|postgres|regression
(1 row)
step s2-rollback:
@ -259,3 +280,18 @@ step s1-commit:
step s3-rollback:
ROLLBACK;
starting permutation: remove-coordinator-from-metadata
create_distributed_table
---------------------------------------------------------------------
(1 row)
step remove-coordinator-from-metadata:
SELECT citus_remove_node('localhost', 57636);
citus_remove_node
---------------------------------------------------------------------
(1 row)

View File

@ -1009,6 +1009,10 @@ SELECT * FROM multi_extension.print_extension_changes();
| function citus_internal_delete_colocation_metadata(integer) void
| function citus_internal_global_blocked_processes() SETOF record
| function citus_internal_local_blocked_processes() SETOF record
| function citus_nodeid_for_gpid(bigint) integer
| function citus_nodename_for_nodeid(integer) text
| function citus_nodeport_for_nodeid(integer) integer
| function citus_pid_for_gpid(bigint) integer
| function citus_run_local_command(text) void
| function citus_shard_indexes_on_worker() SETOF record
| function citus_shards_on_worker() SETOF record
@ -1024,7 +1028,7 @@ SELECT * FROM multi_extension.print_extension_changes();
| function worker_partition_query_result(text,text,integer,citus.distribution_type,text[],text[],boolean,boolean,boolean) SETOF record
| table pg_dist_object
| view citus_stat_activity
(36 rows)
(40 rows)
DROP TABLE multi_extension.prev_objects, multi_extension.extension_diff;
-- show running version

View File

@ -90,6 +90,10 @@ ORDER BY 1;
function citus_local_disk_space_stats()
function citus_move_shard_placement(bigint,text,integer,text,integer,citus.shard_transfer_mode)
function citus_node_capacity_1(integer)
function citus_nodeid_for_gpid(bigint)
function citus_nodename_for_nodeid(integer)
function citus_nodeport_for_nodeid(integer)
function citus_pid_for_gpid(bigint)
function citus_prepare_pg_upgrade()
function citus_query_stats()
function citus_relation_size(regclass)
@ -278,5 +282,5 @@ ORDER BY 1;
view citus_stat_statements
view pg_dist_shard_placement
view time_partitions
(262 rows)
(266 rows)

View File

@ -1,5 +1,9 @@
setup
{
CREATE OR REPLACE FUNCTION test_assign_global_pid()
RETURNS void
LANGUAGE C STRICT
AS 'citus', $$test_assign_global_pid$$;
SET citus.shard_replication_factor TO 1;
SET citus.shard_count TO 4;
select setval('pg_dist_shardid_seq', GREATEST(1300000, nextval('pg_dist_shardid_seq')));
@ -71,8 +75,7 @@ step "s2-sleep"
step "s2-view-dist"
{
SELECT query, state, wait_event_type, wait_event, usename, datname FROM citus_dist_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%BEGIN%'), ('%pg_catalog.pg_isolation_test_session_is_blocked%')) AND backend_type = 'client backend' ORDER BY query DESC;
SELECT query, citus_nodename_for_nodeid(citus_nodeid_for_gpid(global_pid)), citus_nodeport_for_nodeid(citus_nodeid_for_gpid(global_pid)), state, wait_event_type, wait_event, usename, datname FROM citus_dist_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%BEGIN%'), ('%pg_catalog.pg_isolation_test_session_is_blocked%'), ('%citus_add_node%')) AND backend_type = 'client backend' ORDER BY query DESC;
}
session "s3"
@ -89,12 +92,28 @@ step "s3-rollback"
step "s3-view-worker"
{
SELECT query, state, wait_event_type, wait_event, usename, datname FROM citus_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%csa_from_one_node%')) AND is_worker_query = true AND backend_type = 'client backend' ORDER BY query DESC;
SELECT query, citus_nodename_for_nodeid(citus_nodeid_for_gpid(global_pid)), citus_nodeport_for_nodeid(citus_nodeid_for_gpid(global_pid)), state, wait_event_type, wait_event, usename, datname FROM citus_stat_activity WHERE query NOT ILIKE ALL(VALUES('%pg_prepared_xacts%'), ('%COMMIT%'), ('%csa_from_one_node%')) AND is_worker_query = true AND backend_type = 'client backend' ORDER BY query DESC;
}
session "s4"
step "add-coordinator-to-metadata"
{
SELECT 1 FROM citus_add_node('localhost', 57636, groupid:=0);
SELECT test_assign_global_pid();
}
step "remove-coordinator-from-metadata"
{
SELECT citus_remove_node('localhost', 57636);
}
permutation "add-coordinator-to-metadata"
// we prefer to sleep before "s2-view-dist" so that we can ensure
// the "wait_event" in the output doesn't change randomly (e.g., NULL to CliendRead etc.)
permutation "s1-cache-connections" "s1-begin" "s2-begin" "s3-begin" "s1-alter-table" "s2-sleep" "s2-view-dist" "s3-view-worker" "s2-rollback" "s1-commit" "s3-rollback"
permutation "s1-cache-connections" "s1-begin" "s2-begin" "s3-begin" "s1-insert" "s2-sleep" "s2-view-dist" "s3-view-worker" "s2-rollback" "s1-commit" "s3-rollback"
permutation "s1-cache-connections" "s1-begin" "s2-begin" "s3-begin" "s1-select" "s2-sleep" "s2-view-dist" "s3-view-worker" "s2-rollback" "s1-commit" "s3-rollback"
permutation "s1-cache-connections" "s1-begin" "s2-begin" "s3-begin" "s1-select-router" "s2-sleep" "s2-view-dist" "s3-view-worker" "s2-rollback" "s1-commit" "s3-rollback"
permutation "remove-coordinator-from-metadata"

View File

@ -53,4 +53,11 @@ RESET client_min_messages;
SELECT citus_backend_gpid() = citus_calculate_gpid(:coordinator_node_id, pg_backend_pid());
SELECT nodename = citus_nodename_for_nodeid(nodeid) AND nodeport = citus_nodeport_for_nodeid(nodeid)
FROM pg_dist_node
WHERE isactive = true AND noderole = 'primary';
SELECT citus_nodeid_for_gpid(10000000000 * 2 + 3);
SELECT citus_pid_for_gpid(10000000000 * 2 + 3);
DROP SCHEMA global_cancel CASCADE;