From ec67381ba2fab4bf592069f3289d716c15ad0a97 Mon Sep 17 00:00:00 2001 From: Onder Kalaci Date: Tue, 22 Jan 2019 17:32:54 +0300 Subject: [PATCH] Queries with only intermediate results do not rely on task assignment policy Previously we allowed task assignment policy to have affect on router queries with only intermediate results. However, that is erroneous since the code-path that assigns placements relies on shardIds and placements, which doesn't exists for intermediate results. With this commit, we do not apply task assignment policies when a router query hits only intermediate results. --- .../planner/multi_router_planner.c | 11 +++++++--- .../expected/multi_task_assignment_policy.out | 22 +++++++++++++++++++ .../sql/multi_task_assignment_policy.sql | 17 +++++++++++++- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/backend/distributed/planner/multi_router_planner.c b/src/backend/distributed/planner/multi_router_planner.c index e1532c6a5..4f34f13d9 100644 --- a/src/backend/distributed/planner/multi_router_planner.c +++ b/src/backend/distributed/planner/multi_router_planner.c @@ -1630,10 +1630,15 @@ RouterJob(Query *originalQuery, PlannerRestrictionContext *plannerRestrictionCon * Queries to reference tables, or distributed tables with multiple replica's have * their task placements reordered according to the configured * task_assignment_policy. This is only applicable to select queries as the modify - * queries will be reordered to _always_ use the first-replica policy during - * execution. + * queries will _always_ be executed on all placements. + * + * We also ignore queries that are targeting only intermediate results (e.g., no + * valid anchorShardId). */ - ReorderTaskPlacementsByTaskAssignmentPolicy(job, TaskAssignmentPolicy); + if (shardId != INVALID_SHARD_ID) + { + ReorderTaskPlacementsByTaskAssignmentPolicy(job, TaskAssignmentPolicy); + } } else if (isMultiShardModifyQuery) { diff --git a/src/test/regress/expected/multi_task_assignment_policy.out b/src/test/regress/expected/multi_task_assignment_policy.out index 8879ae02a..cabb5f4ac 100644 --- a/src/test/regress/expected/multi_task_assignment_policy.out +++ b/src/test/regress/expected/multi_task_assignment_policy.out @@ -212,3 +212,25 @@ DEBUG: Plan is router executable (2 rows) ROLLBACK; +-- we should be able to use round-robin with router queries that +-- only contains intermediate results +BEGIN; +CREATE TABLE task_assignment_test_table_2 (test_id integer); +SELECT create_distributed_table('task_assignment_test_table_2', 'test_id'); + create_distributed_table +-------------------------- + +(1 row) + +WITH q1 AS (SELECT * FROM task_assignment_test_table_2) SELECT * FROM q1; + test_id +--------- +(0 rows) + +SET LOCAL citus.task_assignment_policy TO 'round-robin'; +WITH q1 AS (SELECT * FROM task_assignment_test_table_2) SELECT * FROM q1; + test_id +--------- +(0 rows) + +ROLLBACK; diff --git a/src/test/regress/sql/multi_task_assignment_policy.sql b/src/test/regress/sql/multi_task_assignment_policy.sql index 5dce8c727..6b2da3948 100644 --- a/src/test/regress/sql/multi_task_assignment_policy.sql +++ b/src/test/regress/sql/multi_task_assignment_policy.sql @@ -118,4 +118,19 @@ SET LOCAL citus.task_assignment_policy TO 'round-robin'; EXPLAIN (COSTS FALSE) SELECT * FROM task_assignment_reference_table; EXPLAIN (COSTS FALSE) SELECT * FROM task_assignment_reference_table; -ROLLBACK; \ No newline at end of file +ROLLBACK; + + + +-- we should be able to use round-robin with router queries that +-- only contains intermediate results +BEGIN; +CREATE TABLE task_assignment_test_table_2 (test_id integer); +SELECT create_distributed_table('task_assignment_test_table_2', 'test_id'); + +WITH q1 AS (SELECT * FROM task_assignment_test_table_2) SELECT * FROM q1; +SET LOCAL citus.task_assignment_policy TO 'round-robin'; +WITH q1 AS (SELECT * FROM task_assignment_test_table_2) SELECT * FROM q1; +ROLLBACK; + +