From 6e059217369caa5d1a6aa66018b3a55fb232a138 Mon Sep 17 00:00:00 2001 From: Onder Kalaci Date: Tue, 23 Oct 2018 14:44:29 +0300 Subject: [PATCH] Processes that are blocked on advisory locks show up in wait edges Assign the distributed transaction id before trying to acquire the executor advisory locks. This is useful to show this backend in citus lock graphs (e.g., dump_global_wait_edges() and citus_lock_waits). --- .../executor/multi_router_executor.c | 9 +- ...isolation_get_distributed_wait_queries.out | 102 +++++++++++++++++- ...solation_get_distributed_wait_queries.spec | 48 +++++++++ 3 files changed, 156 insertions(+), 3 deletions(-) diff --git a/src/backend/distributed/executor/multi_router_executor.c b/src/backend/distributed/executor/multi_router_executor.c index 32f62223a..19081a0b8 100644 --- a/src/backend/distributed/executor/multi_router_executor.c +++ b/src/backend/distributed/executor/multi_router_executor.c @@ -1351,6 +1351,13 @@ ExecuteModifyTasks(List *taskList, bool expectResults, ParamListInfo paramListIn LockPartitionRelations(firstShardInterval->relationId, RowExclusiveLock); } + /* + * Assign the distributed transaction id before trying to acquire the + * executor advisory locks. This is useful to show this backend in citus + * lock graphs (e.g., dump_global_wait_edges() and citus_lock_waits). + */ + BeginOrContinueCoordinatedTransaction(); + /* * Ensure that there are no concurrent modifications on the same * shards. In general, for DDL commands, we already obtained the @@ -1362,8 +1369,6 @@ ExecuteModifyTasks(List *taskList, bool expectResults, ParamListInfo paramListIn */ AcquireExecutorMultiShardLocks(taskList); - BeginOrContinueCoordinatedTransaction(); - if (MultiShardCommitProtocol == COMMIT_PROTOCOL_2PC || firstTask->replicationModel == REPLICATION_MODEL_2PC) { diff --git a/src/test/regress/expected/isolation_get_distributed_wait_queries.out b/src/test/regress/expected/isolation_get_distributed_wait_queries.out index 95df73f0c..1547304b0 100644 --- a/src/test/regress/expected/isolation_get_distributed_wait_queries.out +++ b/src/test/regress/expected/isolation_get_distributed_wait_queries.out @@ -1,4 +1,4 @@ -Parsed test spec with 3 sessions +Parsed test spec with 4 sessions starting permutation: s1-begin s1-update-ref-table-from-coordinator s2-start-session-level-connection s2-begin-on-worker s2-update-ref-table s3-select-distributed-waiting-queries s1-commit s2-commit-worker s2-stop-connection step s1-begin: @@ -747,3 +747,103 @@ stop_session_level_connection_to_node restore_isolation_tester_func + +starting permutation: s1-begin s1-update-on-the-coordinator s2-update-on-the-coordinator s3-select-distributed-waiting-queries s1-commit +step s1-begin: + BEGIN; + +step s1-update-on-the-coordinator: + UPDATE tt1 SET value_1 = 4; + +step s2-update-on-the-coordinator: + UPDATE tt1 SET value_1 = 4; + +step s3-select-distributed-waiting-queries: + SELECT blocked_statement, current_statement_in_blocking_process, waiting_node_name, blocking_node_name, waiting_node_port, blocking_node_port FROM citus_lock_waits; + +blocked_statementcurrent_statement_in_blocking_processwaiting_node_nameblocking_node_namewaiting_node_portblocking_node_port + + + UPDATE tt1 SET value_1 = 4; + + UPDATE tt1 SET value_1 = 4; +coordinator_hostcoordinator_host57636 57636 +step s1-commit: + COMMIT; + +step s2-update-on-the-coordinator: <... completed> +restore_isolation_tester_func + + + +starting permutation: s1-start-session-level-connection s1-begin-on-worker s1-update-dist-table s4-start-session-level-connection s4-begin-on-worker s4-update-dist-table s3-select-distributed-waiting-queries s1-commit-worker s4-commit-worker s1-stop-connection s4-stop-connection +step s1-start-session-level-connection: + SELECT start_session_level_connection_to_node('localhost', 57637); + +start_session_level_connection_to_node + + +step s1-begin-on-worker: + SELECT run_commands_on_session_level_connection_to_node('BEGIN'); + +run_commands_on_session_level_connection_to_node + + +step s1-update-dist-table: + SELECT run_commands_on_session_level_connection_to_node('UPDATE tt1 SET value_1 = 4'); + +run_commands_on_session_level_connection_to_node + + +step s4-start-session-level-connection: + SELECT start_session_level_connection_to_node('localhost', 57637); + +start_session_level_connection_to_node + + +step s4-begin-on-worker: + SELECT run_commands_on_session_level_connection_to_node('BEGIN'); + +run_commands_on_session_level_connection_to_node + + +step s4-update-dist-table: + SELECT run_commands_on_session_level_connection_to_node('UPDATE tt1 SET value_1 = 5'); + +step s3-select-distributed-waiting-queries: + SELECT blocked_statement, current_statement_in_blocking_process, waiting_node_name, blocking_node_name, waiting_node_port, blocking_node_port FROM citus_lock_waits; + +blocked_statementcurrent_statement_in_blocking_processwaiting_node_nameblocking_node_namewaiting_node_portblocking_node_port + +UPDATE tt1 SET value_1 = 5UPDATE tt1 SET value_1 = 4localhost localhost 57637 57637 +step s1-commit-worker: + SELECT run_commands_on_session_level_connection_to_node('COMMIT'); + +run_commands_on_session_level_connection_to_node + + +step s4-update-dist-table: <... completed> +run_commands_on_session_level_connection_to_node + + +step s4-commit-worker: + SELECT run_commands_on_session_level_connection_to_node('COMMIT'); + +run_commands_on_session_level_connection_to_node + + +step s1-stop-connection: + SELECT stop_session_level_connection_to_node(); + +stop_session_level_connection_to_node + + +step s4-stop-connection: + SELECT stop_session_level_connection_to_node(); + +stop_session_level_connection_to_node + + +restore_isolation_tester_func + + diff --git a/src/test/regress/specs/isolation_get_distributed_wait_queries.spec b/src/test/regress/specs/isolation_get_distributed_wait_queries.spec index 809b3f236..973b9a53a 100644 --- a/src/test/regress/specs/isolation_get_distributed_wait_queries.spec +++ b/src/test/regress/specs/isolation_get_distributed_wait_queries.spec @@ -120,6 +120,11 @@ step "s1-stop-connection" SELECT stop_session_level_connection_to_node(); } +step "s1-update-on-the-coordinator" +{ + UPDATE tt1 SET value_1 = 4; +} + step "s1-commit" { COMMIT; @@ -127,6 +132,11 @@ step "s1-commit" session "s2" +step "s2-begin" +{ + COMMIT; +} + step "s2-start-session-level-connection" { SELECT start_session_level_connection_to_node('localhost', 57638); @@ -172,6 +182,11 @@ step "s2-stop-connection" SELECT stop_session_level_connection_to_node(); } +step "s2-update-on-the-coordinator" +{ + UPDATE tt1 SET value_1 = 4; +} + step "s2-commit-worker" { SELECT run_commands_on_session_level_connection_to_node('COMMIT'); @@ -184,6 +199,33 @@ step "s3-select-distributed-waiting-queries" SELECT blocked_statement, current_statement_in_blocking_process, waiting_node_name, blocking_node_name, waiting_node_port, blocking_node_port FROM citus_lock_waits; } +# session s1 and s4 executes the commands on the same worker node +session "s4" + +step "s4-start-session-level-connection" +{ + SELECT start_session_level_connection_to_node('localhost', 57637); +} + +step "s4-begin-on-worker" +{ + SELECT run_commands_on_session_level_connection_to_node('BEGIN'); +} + +step "s4-update-dist-table" +{ + SELECT run_commands_on_session_level_connection_to_node('UPDATE tt1 SET value_1 = 5'); +} + +step "s4-stop-connection" +{ + SELECT stop_session_level_connection_to_node(); +} +step "s4-commit-worker" +{ + SELECT run_commands_on_session_level_connection_to_node('COMMIT'); +} + permutation "s1-begin" "s1-update-ref-table-from-coordinator" "s2-start-session-level-connection" "s2-begin-on-worker" "s2-update-ref-table" "s3-select-distributed-waiting-queries" "s1-commit" "s2-commit-worker" "s2-stop-connection" permutation "s1-start-session-level-connection" "s1-begin-on-worker" "s1-update-ref-table" "s2-start-session-level-connection" "s2-begin-on-worker" "s2-update-ref-table" "s3-select-distributed-waiting-queries" "s1-commit-worker" "s2-commit-worker" "s1-stop-connection" "s2-stop-connection" permutation "s1-start-session-level-connection" "s1-begin-on-worker" "s1-update-dist-table" "s2-start-session-level-connection" "s2-begin-on-worker" "s2-update-dist-table" "s3-select-distributed-waiting-queries" "s1-commit-worker" "s2-commit-worker" "s1-stop-connection" "s2-stop-connection" @@ -195,3 +237,9 @@ permutation "s1-start-session-level-connection" "s1-begin-on-worker" "s1-copy-to permutation "s1-start-session-level-connection" "s1-begin-on-worker" "s1-copy-to-ref-table" "s2-start-session-level-connection" "s2-begin-on-worker" "s2-copy-to-ref-table" "s3-select-distributed-waiting-queries" "s1-commit-worker" "s2-commit-worker" "s1-stop-connection" "s2-stop-connection" permutation "s1-start-session-level-connection" "s1-begin-on-worker" "s1-select-for-update" "s2-start-session-level-connection" "s2-begin-on-worker" "s2-update-ref-table" "s3-select-distributed-waiting-queries" "s1-commit-worker" "s2-commit-worker" "s1-stop-connection" "s2-stop-connection" permutation "s2-start-session-level-connection" "s2-begin-on-worker" "s2-insert-into-ref-table" "s1-begin" "s1-alter-table" "s3-select-distributed-waiting-queries" "s2-commit-worker" "s1-commit" "s2-stop-connection" + +# make sure that multi-shard modification queries +# show up in the waiting processes even if they are +# blocked on the same node +permutation "s1-begin" "s1-update-on-the-coordinator" "s2-update-on-the-coordinator" "s3-select-distributed-waiting-queries" "s1-commit" +permutation "s1-start-session-level-connection" "s1-begin-on-worker" "s1-update-dist-table" "s4-start-session-level-connection" "s4-begin-on-worker" "s4-update-dist-table" "s3-select-distributed-waiting-queries" "s1-commit-worker" "s4-commit-worker" "s1-stop-connection" "s4-stop-connection"