http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/156290a4/query_execution/tests/WorkerSelectionPolicy_unittest.cpp ---------------------------------------------------------------------- diff --git a/query_execution/tests/WorkerSelectionPolicy_unittest.cpp b/query_execution/tests/WorkerSelectionPolicy_unittest.cpp deleted file mode 100644 index 68de5e5..0000000 --- a/query_execution/tests/WorkerSelectionPolicy_unittest.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - **/ - -#include <cstddef> -#include <memory> -#include <random> -#include <utility> -#include <vector> - -#include "gtest/gtest.h" - -#include "query_execution/QueryExecutionTypedefs.hpp" -#include "query_execution/WorkerDirectory.hpp" -#include "query_execution/WorkerSelectionPolicy.hpp" - -namespace quickstep { - -class WorkerSelectionPolicyTest : public ::testing::Test { - protected: - WorkerDirectory* getWorkerDirectory() { - return directory_.get(); - } - - const std::size_t getRandomWorkerID() const { - std::uniform_int_distribution<std::size_t> dist( - 0, directory_->getNumWorkers() - 1); - return dist(*mt_); - } - - void SetUp() { - std::vector<int> numa_nodes; - std::vector<client_id> client_ids; - - numa_nodes.reserve(kNumWorkers); - client_ids.reserve(kNumWorkers); - - std::random_device rd; - mt_.reset(new std::mt19937_64(rd())); - for (std::size_t worker_thread_index = 0; worker_thread_index < kNumWorkers; ++worker_thread_index) { - // NUMA node id = worker_thread_index % 4 - // Client ID = worker_thread_index * 2 + 1 - numa_nodes.push_back(worker_thread_index % 4); - client_ids.push_back(worker_thread_index * 2 + 1); - } - directory_.reset(new WorkerDirectory(kNumWorkers, client_ids, numa_nodes)); - } - - private: - static const std::size_t kNumWorkers = 100; - std::unique_ptr<std::mt19937_64> mt_; - std::unique_ptr<WorkerDirectory> directory_; -}; - -TEST_F(WorkerSelectionPolicyTest, RoundRobinTest) { - // Check if the round robin policy selects the next worker correctly. - const std::size_t kStartWorkerID = getRandomWorkerID(); - RoundRobinWorkerSelectionPolicy rr_policy(*getWorkerDirectory(), - kStartWorkerID); - - const std::size_t kNumIterations = - (getWorkerDirectory()->getNumWorkers()) * 2; - std::size_t expected_next_worker_thread_index = kStartWorkerID; - for (std::size_t iteration = 0; iteration < kNumIterations; ++iteration) { - EXPECT_EQ(expected_next_worker_thread_index, rr_policy.getNextWorkerID()); - expected_next_worker_thread_index = (expected_next_worker_thread_index + 1) % - (getWorkerDirectory()->getNumWorkers()); - } -} - -TEST_F(WorkerSelectionPolicyTest, RoundRobinAddWorkerTest) { - // Add a worker to the worker directory dynamically. Check if this worker - // gets selected by the Round Robin policy. - const std::size_t kStartWorkerID = getWorkerDirectory()->getNumWorkers() - 1; - RoundRobinWorkerSelectionPolicy rr_policy(*getWorkerDirectory(), - kStartWorkerID); - - EXPECT_EQ(kStartWorkerID, rr_policy.getNextWorkerID()); - - // Add a new worker. - const std::size_t new_worker_thread_index = getWorkerDirectory()->getNumWorkers(); - getWorkerDirectory()->addWorker(new_worker_thread_index * 2 + 1 /** client_id **/, - 0 /** NUMA node ID **/); - - EXPECT_EQ(new_worker_thread_index, rr_policy.getNextWorkerID()); -} - -TEST_F(WorkerSelectionPolicyTest, LoadBalancingTest) { - // Create a random set of worker load values (i.e. number of queued workorders) - const std::size_t kMaxLoad = 100; - std::vector<std::size_t> worker_loads; - worker_loads.reserve(getWorkerDirectory()->getNumWorkers()); - - std::random_device rd; - std::mt19937_64 mt(rd()); - std::uniform_int_distribution<std::size_t> dist(0, kMaxLoad); - - for (std::size_t worker_thread_index = 0; - worker_thread_index < getWorkerDirectory()->getNumWorkers(); - ++worker_thread_index) { - // For each worker .. - const std::size_t worker_load = dist(mt); - // assign a random load. - worker_loads.push_back(worker_load); - for (std::size_t workorder_count = 0; - workorder_count < worker_load; - ++workorder_count) { - getWorkerDirectory()->incrementNumQueuedWorkOrders(worker_thread_index); - } - } - - LoadBalancingWorkerSelectionPolicy lb_policy(*getWorkerDirectory()); - // At this point, all the workers have been assigned a random amount of load. - // Keep decrementing one workorder from every worker and check if the policy - // correctly chooses the next worker. - std::size_t zero_load_counts = 0; - for (std::size_t worker_load_index = 0; - zero_load_counts < worker_loads.size(); - worker_load_index = (worker_load_index + 1) % worker_loads.size()) { - EXPECT_EQ(getWorkerDirectory()->getLeastLoadedWorker().first, - lb_policy.getNextWorkerID()); - if (worker_loads[worker_load_index] > 0) { - getWorkerDirectory()->decrementNumQueuedWorkOrders(worker_load_index); - --worker_loads[worker_load_index]; - } else { - ++zero_load_counts; - } - } - EXPECT_EQ(getWorkerDirectory()->getLeastLoadedWorker().first, - lb_policy.getNextWorkerID()); -} - -TEST_F(WorkerSelectionPolicyTest, RandomWorkerPolicyTest) { - // Expect that the randomly chosen worker falls in the limits of worker IDs. - RandomWorkerSelectionPolicy rand_policy(*getWorkerDirectory()); - const std::size_t kNumIterations = 100; - - for (std::size_t iter = 0; iter < kNumIterations; ++iter) { - const std::size_t chosen_worker_thread_index = rand_policy.getNextWorkerID(); - EXPECT_GE(getWorkerDirectory()->getNumWorkers(), chosen_worker_thread_index); - } - - // Add a new worker and repeat the test above. - const std::size_t new_worker_thread_index = getWorkerDirectory()->getNumWorkers(); - getWorkerDirectory()->addWorker(new_worker_thread_index * 2 + 1 /** client_id **/, - 0 /** NUMA node ID **/); - - for (std::size_t iter = 0; iter < kNumIterations; ++iter) { - const std::size_t chosen_worker_thread_index = rand_policy.getNextWorkerID(); - EXPECT_GE(getWorkerDirectory()->getNumWorkers(), chosen_worker_thread_index); - } -} - -} // namespace quickstep
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/156290a4/query_optimizer/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/query_optimizer/CMakeLists.txt b/query_optimizer/CMakeLists.txt deleted file mode 100644 index 10c52a1..0000000 --- a/query_optimizer/CMakeLists.txt +++ /dev/null @@ -1,263 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -if (ENABLE_DISTRIBUTED) - set(QUICKSTEP_DISTRIBUTED TRUE) -endif() - -configure_file ( - "${CMAKE_CURRENT_SOURCE_DIR}/QueryOptimizerConfig.h.in" - "${CMAKE_CURRENT_BINARY_DIR}/QueryOptimizerConfig.h" -) - -if (BUILD_SHARED_LIBS) - set(GFLAGS_LIB_NAME gflags_nothreads-shared) -else() - set(GFLAGS_LIB_NAME gflags_nothreads-static) -endif() - -add_subdirectory(cost_model) -add_subdirectory(expressions) -add_subdirectory(logical) -add_subdirectory(physical) -add_subdirectory(resolver) -add_subdirectory(rules) -add_subdirectory(strategy) -add_subdirectory(tests) - -# Declare micro-libs: -add_library(quickstep_queryoptimizer_ExecutionGenerator ExecutionGenerator.cpp ExecutionGenerator.hpp) -add_library(quickstep_queryoptimizer_LIPFilterGenerator LIPFilterGenerator.cpp LIPFilterGenerator.hpp) -add_library(quickstep_queryoptimizer_LogicalGenerator LogicalGenerator.cpp LogicalGenerator.hpp) -add_library(quickstep_queryoptimizer_LogicalToPhysicalMapper - ../empty_src.cpp - LogicalToPhysicalMapper.hpp) -add_library(quickstep_queryoptimizer_Optimizer Optimizer.cpp Optimizer.hpp) -add_library(quickstep_queryoptimizer_OptimizerContext OptimizerContext.cpp OptimizerContext.hpp) -add_library(quickstep_queryoptimizer_OptimizerTree ../empty_src.cpp OptimizerTree.hpp) -add_library(quickstep_queryoptimizer_PhysicalGenerator PhysicalGenerator.cpp PhysicalGenerator.hpp) -add_library(quickstep_queryoptimizer_QueryHandle ../empty_src.cpp QueryHandle.hpp) -add_library(quickstep_queryoptimizer_QueryPlan ../empty_src.cpp QueryPlan.hpp) -add_library(quickstep_queryoptimizer_QueryProcessor QueryProcessor.cpp QueryProcessor.hpp) -add_library(quickstep_queryoptimizer_Validator ../empty_src.cpp Validator.hpp) - -# Link dependencies: -target_link_libraries(quickstep_queryoptimizer_ExecutionGenerator - glog - quickstep_catalog_CatalogAttribute - quickstep_catalog_CatalogDatabase - quickstep_catalog_CatalogRelation - quickstep_catalog_CatalogRelationSchema - quickstep_catalog_CatalogTypedefs - quickstep_expressions_Expressions_proto - quickstep_expressions_aggregation_AggregateFunction - quickstep_expressions_aggregation_AggregateFunction_proto - quickstep_expressions_predicate_Predicate - quickstep_expressions_scalar_Scalar - quickstep_expressions_scalar_ScalarAttribute - quickstep_expressions_windowaggregation_WindowAggregateFunction - quickstep_expressions_windowaggregation_WindowAggregateFunction_proto - quickstep_queryexecution_QueryContext - quickstep_queryexecution_QueryContext_proto - quickstep_queryoptimizer_LIPFilterGenerator - quickstep_queryoptimizer_OptimizerContext - quickstep_queryoptimizer_QueryHandle - quickstep_queryoptimizer_QueryPlan - quickstep_queryoptimizer_costmodel_CostModel - quickstep_queryoptimizer_costmodel_SimpleCostModel - quickstep_queryoptimizer_costmodel_StarSchemaSimpleCostModel - quickstep_queryoptimizer_expressions_AggregateFunction - quickstep_queryoptimizer_expressions_Alias - quickstep_queryoptimizer_expressions_AttributeReference - quickstep_queryoptimizer_expressions_ComparisonExpression - quickstep_queryoptimizer_expressions_ExprId - quickstep_queryoptimizer_expressions_ExpressionType - quickstep_queryoptimizer_expressions_NamedExpression - quickstep_queryoptimizer_expressions_PatternMatcher - quickstep_queryoptimizer_expressions_Predicate - quickstep_queryoptimizer_expressions_Scalar - quickstep_queryoptimizer_expressions_ScalarLiteral - quickstep_queryoptimizer_expressions_WindowAggregateFunction - quickstep_queryoptimizer_physical_Aggregate - quickstep_queryoptimizer_physical_CopyFrom - quickstep_queryoptimizer_physical_CreateIndex - quickstep_queryoptimizer_physical_CreateTable - quickstep_queryoptimizer_physical_DeleteTuples - quickstep_queryoptimizer_physical_DropTable - quickstep_queryoptimizer_physical_HashJoin - quickstep_queryoptimizer_physical_InsertSelection - quickstep_queryoptimizer_physical_InsertTuple - quickstep_queryoptimizer_physical_LIPFilterConfiguration - quickstep_queryoptimizer_physical_NestedLoopsJoin - quickstep_queryoptimizer_physical_PatternMatcher - quickstep_queryoptimizer_physical_Physical - quickstep_queryoptimizer_physical_PhysicalType - quickstep_queryoptimizer_physical_Sample - quickstep_queryoptimizer_physical_Selection - quickstep_queryoptimizer_physical_SharedSubplanReference - quickstep_queryoptimizer_physical_Sort - quickstep_queryoptimizer_physical_TableGenerator - quickstep_queryoptimizer_physical_TableReference - quickstep_queryoptimizer_physical_TopLevelPlan - quickstep_queryoptimizer_physical_UpdateTable - quickstep_queryoptimizer_physical_WindowAggregate - quickstep_relationaloperators_AggregationOperator - quickstep_relationaloperators_BuildHashOperator - quickstep_relationaloperators_CreateIndexOperator - quickstep_relationaloperators_CreateTableOperator - quickstep_relationaloperators_DeleteOperator - quickstep_relationaloperators_DestroyAggregationStateOperator - quickstep_relationaloperators_DestroyHashOperator - quickstep_relationaloperators_DropTableOperator - quickstep_relationaloperators_FinalizeAggregationOperator - quickstep_relationaloperators_HashJoinOperator - quickstep_relationaloperators_InsertOperator - quickstep_relationaloperators_NestedLoopsJoinOperator - quickstep_relationaloperators_RelationalOperator - quickstep_relationaloperators_SampleOperator - quickstep_relationaloperators_SaveBlocksOperator - quickstep_relationaloperators_SelectOperator - quickstep_relationaloperators_SortMergeRunOperator - quickstep_relationaloperators_SortRunGenerationOperator - quickstep_relationaloperators_TableGeneratorOperator - quickstep_relationaloperators_TextScanOperator - quickstep_relationaloperators_UpdateOperator - quickstep_relationaloperators_WindowAggregationOperator - quickstep_storage_AggregationOperationState_proto - quickstep_storage_HashTableFactory - quickstep_storage_HashTable_proto - quickstep_storage_InsertDestination_proto - quickstep_storage_StorageBlockLayout - quickstep_storage_StorageBlockLayout_proto - quickstep_storage_SubBlockTypeRegistry - quickstep_types_Type - quickstep_types_Type_proto - quickstep_types_TypedValue - quickstep_types_TypedValue_proto - quickstep_types_containers_Tuple_proto - quickstep_utility_Macros - quickstep_utility_SqlError) -if (ENABLE_DISTRIBUTED) - target_link_libraries(quickstep_queryoptimizer_ExecutionGenerator - quickstep_catalog_Catalog_proto) -endif() -target_link_libraries(quickstep_queryoptimizer_LIPFilterGenerator - glog - quickstep_catalog_CatalogAttribute - quickstep_queryexecution_QueryContext - quickstep_queryexecution_QueryContext_proto - quickstep_queryoptimizer_QueryPlan - quickstep_queryoptimizer_expressions_ExprId - quickstep_queryoptimizer_physical_Aggregate - quickstep_queryoptimizer_physical_HashJoin - quickstep_queryoptimizer_physical_LIPFilterConfiguration - quickstep_queryoptimizer_physical_Physical - quickstep_queryoptimizer_physical_Selection - quickstep_relationaloperators_RelationalOperator - quickstep_types_Type - quickstep_utility_Macros - quickstep_utility_lipfilter_LIPFilter - quickstep_utility_lipfilter_LIPFilter_proto) -target_link_libraries(quickstep_queryoptimizer_LogicalGenerator - glog - quickstep_parser_ParseStatement - quickstep_queryoptimizer_OptimizerContext - quickstep_queryoptimizer_logical_Logical - quickstep_queryoptimizer_resolver_Resolver - quickstep_queryoptimizer_rules_CollapseProject - quickstep_queryoptimizer_rules_GenerateJoins - quickstep_queryoptimizer_rules_PushDownFilter - quickstep_queryoptimizer_rules_PushDownSemiAntiJoin - quickstep_queryoptimizer_rules_Rule - quickstep_queryoptimizer_rules_UnnestSubqueries - quickstep_queryoptimizer_Validator - quickstep_utility_Macros) -target_link_libraries(quickstep_queryoptimizer_LogicalToPhysicalMapper - quickstep_queryoptimizer_logical_Logical - quickstep_queryoptimizer_physical_Physical - quickstep_utility_Macros) -target_link_libraries(quickstep_queryoptimizer_Optimizer - quickstep_queryoptimizer_ExecutionGenerator - quickstep_queryoptimizer_LogicalGenerator - quickstep_queryoptimizer_PhysicalGenerator - quickstep_utility_Macros) -target_link_libraries(quickstep_queryoptimizer_OptimizerContext - quickstep_queryoptimizer_expressions_ExprId - quickstep_utility_Macros) -target_link_libraries(quickstep_queryoptimizer_OptimizerTree - quickstep_storage_StorageBlockLayout_proto - quickstep_utility_Macros - quickstep_utility_TreeStringSerializable) -target_link_libraries(quickstep_queryoptimizer_PhysicalGenerator - ${GFLAGS_LIB_NAME} - quickstep_queryoptimizer_LogicalToPhysicalMapper - quickstep_queryoptimizer_logical_Logical - quickstep_queryoptimizer_physical_Physical - quickstep_queryoptimizer_rules_AttachLIPFilters - quickstep_queryoptimizer_rules_PruneColumns - quickstep_queryoptimizer_rules_StarSchemaHashJoinOrderOptimization - quickstep_queryoptimizer_rules_SwapProbeBuild - quickstep_queryoptimizer_strategy_Aggregate - quickstep_queryoptimizer_strategy_Join - quickstep_queryoptimizer_strategy_OneToOne - quickstep_queryoptimizer_strategy_Selection - quickstep_queryoptimizer_strategy_Strategy - quickstep_queryoptimizer_Validator - quickstep_utility_Macros - quickstep_utility_PlanVisualizer) -target_link_libraries(quickstep_queryoptimizer_QueryHandle - quickstep_catalog_Catalog_proto - quickstep_queryexecution_QueryContext_proto - quickstep_queryoptimizer_QueryPlan - quickstep_utility_Macros - tmb) -target_link_libraries(quickstep_queryoptimizer_QueryPlan - quickstep_relationaloperators_RelationalOperator - quickstep_utility_DAG - quickstep_utility_Macros) -target_link_libraries(quickstep_queryoptimizer_QueryProcessor - quickstep_catalog_Catalog - quickstep_catalog_Catalog_proto - quickstep_queryoptimizer_Optimizer - quickstep_queryoptimizer_OptimizerContext - quickstep_utility_Macros) -target_link_libraries(quickstep_queryoptimizer_Validator - glog - quickstep_queryoptimizer_expressions_AttributeReference - quickstep_queryoptimizer_expressions_ExpressionUtil) - -# Module all-in-one library: -add_library(quickstep_queryoptimizer ../empty_src.cpp QueryOptimizerModule.hpp) -target_link_libraries(quickstep_queryoptimizer - quickstep_queryoptimizer_ExecutionGenerator - quickstep_queryoptimizer_LIPFilterGenerator - quickstep_queryoptimizer_LogicalGenerator - quickstep_queryoptimizer_LogicalToPhysicalMapper - quickstep_queryoptimizer_Optimizer - quickstep_queryoptimizer_OptimizerContext - quickstep_queryoptimizer_OptimizerTree - quickstep_queryoptimizer_PhysicalGenerator - quickstep_queryoptimizer_QueryHandle - quickstep_queryoptimizer_QueryPlan - quickstep_queryoptimizer_QueryProcessor - quickstep_queryoptimizer_Validator - quickstep_queryoptimizer_costmodel - quickstep_queryoptimizer_expressions - quickstep_queryoptimizer_logical - quickstep_queryoptimizer_physical - quickstep_queryoptimizer_resolver - quickstep_queryoptimizer_rules)