DRILL-5547: Linking config options with system option manager closes #868
Project: http://git-wip-us.apache.org/repos/asf/drill/repo Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/a51c98b8 Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/a51c98b8 Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/a51c98b8 Branch: refs/heads/master Commit: a51c98b8bf210bbe9d3f4018361d937252d1226d Parents: a344202 Author: Jyothsna Donapati <jyothsnadonapati@Skatkam-598.local> Authored: Wed Jun 7 11:15:08 2017 -0700 Committer: Paul Rogers <prog...@maprtech.com> Committed: Fri Aug 25 20:50:10 2017 -0700 ---------------------------------------------------------------------- .../org/apache/drill/exec/ExecConstants.java | 173 +++++++-------- .../exec/compile/ClassCompilerSelector.java | 6 +- .../planner/fragment/SimpleParallelizer.java | 5 +- .../exec/planner/physical/PlannerSettings.java | 74 +++---- .../planner/sql/handlers/DefaultSqlHandler.java | 4 +- .../planner/sql/handlers/SetOptionHandler.java | 21 +- .../rpc/user/InboundImpersonationManager.java | 4 +- .../apache/drill/exec/rpc/user/UserSession.java | 6 +- .../org/apache/drill/exec/server/Drillbit.java | 3 +- .../drill/exec/server/DrillbitContext.java | 2 +- .../exec/server/options/BaseOptionManager.java | 1 + .../server/options/DrillConfigIterator.java | 7 +- .../server/options/FallbackOptionManager.java | 27 ++- .../exec/server/options/OptionValidator.java | 10 +- .../drill/exec/server/options/OptionValue.java | 46 ++-- .../server/options/SessionOptionManager.java | 10 +- .../server/options/SystemOptionManager.java | 97 ++++++--- .../exec/server/options/TypeValidators.java | 131 ++++++++---- .../drill/exec/server/rest/StatusResources.java | 2 +- .../exec/store/sys/ExtendedOptionIterator.java | 155 ++++++++++++++ .../drill/exec/store/sys/OptionIterator.java | 7 +- .../drill/exec/store/sys/SystemTable.java | 8 + .../drill/exec/testing/ExecutionControls.java | 14 +- .../exec/util/MemoryAllocationUtilities.java | 4 +- .../src/main/resources/drill-module.conf | 147 +++++++++++++ .../java/org/apache/drill/PlanningBase.java | 2 +- .../java/org/apache/drill/QueryTestUtil.java | 3 +- .../java/org/apache/drill/exec/ExecTest.java | 2 +- .../exec/compile/CodeCompilerTestFactory.java | 2 +- .../exec/compile/TestClassTransformation.java | 13 +- .../compile/bytecode/ReplaceMethodInvoke.java | 2 +- .../TestInboundImpersonationPrivileges.java | 2 +- .../partitionsender/TestPartitionSender.java | 11 +- .../exec/testing/ControlsInjectionUtil.java | 3 +- .../work/metadata/TestMetadataProvider.java | 8 +- .../org/apache/drill/test/FixtureBuilder.java | 9 + .../org/apache/drill/test/OperatorFixture.java | 9 +- .../apache/drill/test/TestConfigLinkage.java | 209 +++++++++++++++++++ .../drill/jdbc/test/TestJdbcMetadata.java | 4 +- 39 files changed, 979 insertions(+), 264 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/ExecConstants.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/ExecConstants.java b/exec/java-exec/src/main/java/org/apache/drill/exec/ExecConstants.java index a88875f..95ee00e 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/ExecConstants.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/ExecConstants.java @@ -29,8 +29,8 @@ import org.apache.drill.exec.server.options.TypeValidators.PowerOfTwoLongValidat import org.apache.drill.exec.server.options.TypeValidators.RangeDoubleValidator; import org.apache.drill.exec.server.options.TypeValidators.RangeLongValidator; import org.apache.drill.exec.server.options.TypeValidators.StringValidator; +import org.apache.drill.exec.server.options.TypeValidators.MaxWidthValidator; import org.apache.drill.exec.testing.ExecutionControls; -import org.apache.drill.exec.util.ImpersonationUtil; public interface ExecConstants { String ZK_RETRY_TIMES = "drill.exec.zk.retry.count"; @@ -88,22 +88,22 @@ public interface ExecConstants { // External Sort Runtime options - BooleanValidator EXTERNAL_SORT_DISABLE_MANAGED_OPTION = new BooleanValidator("exec.sort.disable_managed", false); + BooleanValidator EXTERNAL_SORT_DISABLE_MANAGED_OPTION = new BooleanValidator("exec.sort.disable_managed"); // Hash Aggregate Options String HASHAGG_NUM_PARTITIONS = "drill.exec.hashagg.num_partitions"; String HASHAGG_NUM_PARTITIONS_KEY = "exec.hashagg.num_partitions"; - LongValidator HASHAGG_NUM_PARTITIONS_VALIDATOR = new RangeLongValidator(HASHAGG_NUM_PARTITIONS_KEY, 1, 128, 32); // 1 means - no spilling + LongValidator HASHAGG_NUM_PARTITIONS_VALIDATOR = new RangeLongValidator(HASHAGG_NUM_PARTITIONS_KEY, 1, 128); // 1 means - no spilling String HASHAGG_MAX_MEMORY = "drill.exec.hashagg.mem_limit"; String HASHAGG_MAX_MEMORY_KEY = "exec.hashagg.mem_limit"; - LongValidator HASHAGG_MAX_MEMORY_VALIDATOR = new RangeLongValidator(HASHAGG_MAX_MEMORY_KEY, 0, Integer.MAX_VALUE, 0); + LongValidator HASHAGG_MAX_MEMORY_VALIDATOR = new RangeLongValidator(HASHAGG_MAX_MEMORY_KEY, 0, Integer.MAX_VALUE); // min batches is used for tuning (each partition needs so many batches when planning the number of partitions, // or reserve this number when calculating whether the remaining available memory is too small and requires a spill.) // Low value may OOM (e.g., when incoming rows become wider), higher values use fewer partitions but are safer String HASHAGG_MIN_BATCHES_PER_PARTITION = "drill.exec.hashagg.min_batches_per_partition"; String HASHAGG_MIN_BATCHES_PER_PARTITION_KEY = "drill.exec.hashagg.min_batches_per_partition"; - LongValidator HASHAGG_MIN_BATCHES_PER_PARTITION_VALIDATOR = new RangeLongValidator(HASHAGG_MIN_BATCHES_PER_PARTITION_KEY, 2, 5, 3); + LongValidator HASHAGG_MIN_BATCHES_PER_PARTITION_VALIDATOR = new RangeLongValidator(HASHAGG_MIN_BATCHES_PER_PARTITION_KEY, 2, 5); String HASHAGG_SPILL_DIRS = "drill.exec.hashagg.spill.directories"; String HASHAGG_SPILL_FILESYSTEM = "drill.exec.hashagg.spill.fs"; @@ -186,70 +186,70 @@ public interface ExecConstants { String DEFAULT_TEMPORARY_WORKSPACE = "drill.exec.default_temporary_workspace"; String OUTPUT_FORMAT_OPTION = "store.format"; - OptionValidator OUTPUT_FORMAT_VALIDATOR = new StringValidator(OUTPUT_FORMAT_OPTION, "parquet"); + OptionValidator OUTPUT_FORMAT_VALIDATOR = new StringValidator(OUTPUT_FORMAT_OPTION); String PARQUET_BLOCK_SIZE = "store.parquet.block-size"; String PARQUET_WRITER_USE_SINGLE_FS_BLOCK = "store.parquet.writer.use_single_fs_block"; OptionValidator PARQUET_WRITER_USE_SINGLE_FS_BLOCK_VALIDATOR = new BooleanValidator( - PARQUET_WRITER_USE_SINGLE_FS_BLOCK, false); - OptionValidator PARQUET_BLOCK_SIZE_VALIDATOR = new PositiveLongValidator(PARQUET_BLOCK_SIZE, Integer.MAX_VALUE, 512 * 1024 * 1024); + PARQUET_WRITER_USE_SINGLE_FS_BLOCK); + OptionValidator PARQUET_BLOCK_SIZE_VALIDATOR = new PositiveLongValidator(PARQUET_BLOCK_SIZE, Integer.MAX_VALUE); String PARQUET_PAGE_SIZE = "store.parquet.page-size"; - OptionValidator PARQUET_PAGE_SIZE_VALIDATOR = new PositiveLongValidator(PARQUET_PAGE_SIZE, Integer.MAX_VALUE, 1024 * 1024); + OptionValidator PARQUET_PAGE_SIZE_VALIDATOR = new PositiveLongValidator(PARQUET_PAGE_SIZE, Integer.MAX_VALUE); String PARQUET_DICT_PAGE_SIZE = "store.parquet.dictionary.page-size"; - OptionValidator PARQUET_DICT_PAGE_SIZE_VALIDATOR = new PositiveLongValidator(PARQUET_DICT_PAGE_SIZE, Integer.MAX_VALUE, 1024 * 1024); + OptionValidator PARQUET_DICT_PAGE_SIZE_VALIDATOR = new PositiveLongValidator(PARQUET_DICT_PAGE_SIZE, Integer.MAX_VALUE); String PARQUET_WRITER_COMPRESSION_TYPE = "store.parquet.compression"; OptionValidator PARQUET_WRITER_COMPRESSION_TYPE_VALIDATOR = new EnumeratedStringValidator( - PARQUET_WRITER_COMPRESSION_TYPE, "snappy", "snappy", "gzip", "none"); + PARQUET_WRITER_COMPRESSION_TYPE, "snappy", "gzip", "none"); String PARQUET_WRITER_ENABLE_DICTIONARY_ENCODING = "store.parquet.enable_dictionary_encoding"; OptionValidator PARQUET_WRITER_ENABLE_DICTIONARY_ENCODING_VALIDATOR = new BooleanValidator( - PARQUET_WRITER_ENABLE_DICTIONARY_ENCODING, false); + PARQUET_WRITER_ENABLE_DICTIONARY_ENCODING); String PARQUET_VECTOR_FILL_THRESHOLD = "store.parquet.vector_fill_threshold"; - OptionValidator PARQUET_VECTOR_FILL_THRESHOLD_VALIDATOR = new PositiveLongValidator(PARQUET_VECTOR_FILL_THRESHOLD, 99l, 85l); + OptionValidator PARQUET_VECTOR_FILL_THRESHOLD_VALIDATOR = new PositiveLongValidator(PARQUET_VECTOR_FILL_THRESHOLD, 99l); String PARQUET_VECTOR_FILL_CHECK_THRESHOLD = "store.parquet.vector_fill_check_threshold"; - OptionValidator PARQUET_VECTOR_FILL_CHECK_THRESHOLD_VALIDATOR = new PositiveLongValidator(PARQUET_VECTOR_FILL_CHECK_THRESHOLD, 100l, 10l); + OptionValidator PARQUET_VECTOR_FILL_CHECK_THRESHOLD_VALIDATOR = new PositiveLongValidator(PARQUET_VECTOR_FILL_CHECK_THRESHOLD, 100l); String PARQUET_NEW_RECORD_READER = "store.parquet.use_new_reader"; - OptionValidator PARQUET_RECORD_READER_IMPLEMENTATION_VALIDATOR = new BooleanValidator(PARQUET_NEW_RECORD_READER, false); + OptionValidator PARQUET_RECORD_READER_IMPLEMENTATION_VALIDATOR = new BooleanValidator(PARQUET_NEW_RECORD_READER); String PARQUET_READER_INT96_AS_TIMESTAMP = "store.parquet.reader.int96_as_timestamp"; - OptionValidator PARQUET_READER_INT96_AS_TIMESTAMP_VALIDATOR = new BooleanValidator(PARQUET_READER_INT96_AS_TIMESTAMP, false); + OptionValidator PARQUET_READER_INT96_AS_TIMESTAMP_VALIDATOR = new BooleanValidator(PARQUET_READER_INT96_AS_TIMESTAMP); String PARQUET_PAGEREADER_ASYNC = "store.parquet.reader.pagereader.async"; - OptionValidator PARQUET_PAGEREADER_ASYNC_VALIDATOR = new BooleanValidator(PARQUET_PAGEREADER_ASYNC, true); + OptionValidator PARQUET_PAGEREADER_ASYNC_VALIDATOR = new BooleanValidator(PARQUET_PAGEREADER_ASYNC); // Number of pages the Async Parquet page reader will read before blocking String PARQUET_PAGEREADER_QUEUE_SIZE = "store.parquet.reader.pagereader.queuesize"; - OptionValidator PARQUET_PAGEREADER_QUEUE_SIZE_VALIDATOR = new PositiveLongValidator(PARQUET_PAGEREADER_QUEUE_SIZE, Integer.MAX_VALUE, 2); + OptionValidator PARQUET_PAGEREADER_QUEUE_SIZE_VALIDATOR = new PositiveLongValidator(PARQUET_PAGEREADER_QUEUE_SIZE, Integer.MAX_VALUE); String PARQUET_PAGEREADER_ENFORCETOTALSIZE = "store.parquet.reader.pagereader.enforceTotalSize"; - OptionValidator PARQUET_PAGEREADER_ENFORCETOTALSIZE_VALIDATOR = new BooleanValidator(PARQUET_PAGEREADER_ENFORCETOTALSIZE, false); + OptionValidator PARQUET_PAGEREADER_ENFORCETOTALSIZE_VALIDATOR = new BooleanValidator(PARQUET_PAGEREADER_ENFORCETOTALSIZE); String PARQUET_COLUMNREADER_ASYNC = "store.parquet.reader.columnreader.async"; - OptionValidator PARQUET_COLUMNREADER_ASYNC_VALIDATOR = new BooleanValidator(PARQUET_COLUMNREADER_ASYNC, false); + OptionValidator PARQUET_COLUMNREADER_ASYNC_VALIDATOR = new BooleanValidator(PARQUET_COLUMNREADER_ASYNC); // Use a buffering reader for parquet page reader String PARQUET_PAGEREADER_USE_BUFFERED_READ = "store.parquet.reader.pagereader.bufferedread"; - OptionValidator PARQUET_PAGEREADER_USE_BUFFERED_READ_VALIDATOR = new BooleanValidator(PARQUET_PAGEREADER_USE_BUFFERED_READ, true); + OptionValidator PARQUET_PAGEREADER_USE_BUFFERED_READ_VALIDATOR = new BooleanValidator(PARQUET_PAGEREADER_USE_BUFFERED_READ); // Size in MiB of the buffer the Parquet page reader will use to read from disk. Default is 1 MiB String PARQUET_PAGEREADER_BUFFER_SIZE = "store.parquet.reader.pagereader.buffersize"; - OptionValidator PARQUET_PAGEREADER_BUFFER_SIZE_VALIDATOR = new LongValidator(PARQUET_PAGEREADER_BUFFER_SIZE, 1*1024*1024); + OptionValidator PARQUET_PAGEREADER_BUFFER_SIZE_VALIDATOR = new LongValidator(PARQUET_PAGEREADER_BUFFER_SIZE); // try to use fadvise if available String PARQUET_PAGEREADER_USE_FADVISE = "store.parquet.reader.pagereader.usefadvise"; - OptionValidator PARQUET_PAGEREADER_USE_FADVISE_VALIDATOR = new BooleanValidator(PARQUET_PAGEREADER_USE_FADVISE, false); + OptionValidator PARQUET_PAGEREADER_USE_FADVISE_VALIDATOR = new BooleanValidator(PARQUET_PAGEREADER_USE_FADVISE); - OptionValidator COMPILE_SCALAR_REPLACEMENT = new BooleanValidator("exec.compile.scalar_replacement", false); + OptionValidator COMPILE_SCALAR_REPLACEMENT = new BooleanValidator("exec.compile.scalar_replacement"); String JSON_ALL_TEXT_MODE = "store.json.all_text_mode"; - BooleanValidator JSON_READER_ALL_TEXT_MODE_VALIDATOR = new BooleanValidator(JSON_ALL_TEXT_MODE, false); - BooleanValidator JSON_EXTENDED_TYPES = new BooleanValidator("store.json.extended_types", false); - BooleanValidator JSON_WRITER_UGLIFY = new BooleanValidator("store.json.writer.uglify", false); - BooleanValidator JSON_WRITER_SKIPNULLFIELDS = new BooleanValidator("store.json.writer.skip_null_fields", true); + BooleanValidator JSON_READER_ALL_TEXT_MODE_VALIDATOR = new BooleanValidator(JSON_ALL_TEXT_MODE); + BooleanValidator JSON_EXTENDED_TYPES = new BooleanValidator("store.json.extended_types"); + BooleanValidator JSON_WRITER_UGLIFY = new BooleanValidator("store.json.writer.uglify"); + BooleanValidator JSON_WRITER_SKIPNULLFIELDS = new BooleanValidator("store.json.writer.skip_null_fields"); String JSON_READER_SKIP_INVALID_RECORDS_FLAG = "store.json.reader.skip_invalid_records"; - BooleanValidator JSON_SKIP_MALFORMED_RECORDS_VALIDATOR = new BooleanValidator(JSON_READER_SKIP_INVALID_RECORDS_FLAG, false); + BooleanValidator JSON_SKIP_MALFORMED_RECORDS_VALIDATOR = new BooleanValidator(JSON_READER_SKIP_INVALID_RECORDS_FLAG); String JSON_READER_PRINT_INVALID_RECORDS_LINE_NOS_FLAG = "store.json.reader.print_skipped_invalid_record_number"; - BooleanValidator JSON_READER_PRINT_INVALID_RECORDS_LINE_NOS_FLAG_VALIDATOR = new BooleanValidator(JSON_READER_PRINT_INVALID_RECORDS_LINE_NOS_FLAG, false); + BooleanValidator JSON_READER_PRINT_INVALID_RECORDS_LINE_NOS_FLAG_VALIDATOR = new BooleanValidator(JSON_READER_PRINT_INVALID_RECORDS_LINE_NOS_FLAG); DoubleValidator TEXT_ESTIMATED_ROW_SIZE = new RangeDoubleValidator( - "store.text.estimated_row_size_bytes", 1, Long.MAX_VALUE, 100.0); + "store.text.estimated_row_size_bytes", 1, Long.MAX_VALUE); /** * The column label (for directory levels) in results when querying files in a directory @@ -259,59 +259,61 @@ public interface ExecConstants { * |- baz - b.parquet */ String FILESYSTEM_PARTITION_COLUMN_LABEL = "drill.exec.storage.file.partition.column.label"; - OptionValidator FILESYSTEM_PARTITION_COLUMN_LABEL_VALIDATOR = new StringValidator(FILESYSTEM_PARTITION_COLUMN_LABEL, "dir"); + OptionValidator FILESYSTEM_PARTITION_COLUMN_LABEL_VALIDATOR = new StringValidator(FILESYSTEM_PARTITION_COLUMN_LABEL); /** * Implicit file columns */ String IMPLICIT_FILENAME_COLUMN_LABEL = "drill.exec.storage.implicit.filename.column.label"; - OptionValidator IMPLICIT_FILENAME_COLUMN_LABEL_VALIDATOR = new StringValidator(IMPLICIT_FILENAME_COLUMN_LABEL, "filename"); + OptionValidator IMPLICIT_FILENAME_COLUMN_LABEL_VALIDATOR = new StringValidator(IMPLICIT_FILENAME_COLUMN_LABEL); String IMPLICIT_SUFFIX_COLUMN_LABEL = "drill.exec.storage.implicit.suffix.column.label"; - OptionValidator IMPLICIT_SUFFIX_COLUMN_LABEL_VALIDATOR = new StringValidator(IMPLICIT_SUFFIX_COLUMN_LABEL, "suffix"); + OptionValidator IMPLICIT_SUFFIX_COLUMN_LABEL_VALIDATOR = new StringValidator(IMPLICIT_SUFFIX_COLUMN_LABEL); String IMPLICIT_FQN_COLUMN_LABEL = "drill.exec.storage.implicit.fqn.column.label"; - OptionValidator IMPLICIT_FQN_COLUMN_LABEL_VALIDATOR = new StringValidator(IMPLICIT_FQN_COLUMN_LABEL, "fqn"); + OptionValidator IMPLICIT_FQN_COLUMN_LABEL_VALIDATOR = new StringValidator(IMPLICIT_FQN_COLUMN_LABEL); String IMPLICIT_FILEPATH_COLUMN_LABEL = "drill.exec.storage.implicit.filepath.column.label"; - OptionValidator IMPLICIT_FILEPATH_COLUMN_LABEL_VALIDATOR = new StringValidator(IMPLICIT_FILEPATH_COLUMN_LABEL, "filepath"); + OptionValidator IMPLICIT_FILEPATH_COLUMN_LABEL_VALIDATOR = new StringValidator(IMPLICIT_FILEPATH_COLUMN_LABEL); String JSON_READ_NUMBERS_AS_DOUBLE = "store.json.read_numbers_as_double"; - BooleanValidator JSON_READ_NUMBERS_AS_DOUBLE_VALIDATOR = new BooleanValidator(JSON_READ_NUMBERS_AS_DOUBLE, false); + BooleanValidator JSON_READ_NUMBERS_AS_DOUBLE_VALIDATOR = new BooleanValidator(JSON_READ_NUMBERS_AS_DOUBLE); String MONGO_ALL_TEXT_MODE = "store.mongo.all_text_mode"; - OptionValidator MONGO_READER_ALL_TEXT_MODE_VALIDATOR = new BooleanValidator(MONGO_ALL_TEXT_MODE, false); + OptionValidator MONGO_READER_ALL_TEXT_MODE_VALIDATOR = new BooleanValidator(MONGO_ALL_TEXT_MODE); String MONGO_READER_READ_NUMBERS_AS_DOUBLE = "store.mongo.read_numbers_as_double"; - OptionValidator MONGO_READER_READ_NUMBERS_AS_DOUBLE_VALIDATOR = new BooleanValidator(MONGO_READER_READ_NUMBERS_AS_DOUBLE, false); + OptionValidator MONGO_READER_READ_NUMBERS_AS_DOUBLE_VALIDATOR = new BooleanValidator(MONGO_READER_READ_NUMBERS_AS_DOUBLE); String MONGO_BSON_RECORD_READER = "store.mongo.bson.record.reader"; - OptionValidator MONGO_BSON_RECORD_READER_VALIDATOR = new BooleanValidator(MONGO_BSON_RECORD_READER, true); + OptionValidator MONGO_BSON_RECORD_READER_VALIDATOR = new BooleanValidator(MONGO_BSON_RECORD_READER); - BooleanValidator ENABLE_UNION_TYPE = new BooleanValidator("exec.enable_union_type", false); + BooleanValidator ENABLE_UNION_TYPE = new BooleanValidator("exec.enable_union_type"); // TODO: We need to add a feature that enables storage plugins to add their own options. Currently we have to declare // in core which is not right. Move this option and above two mongo plugin related options once we have the feature. String HIVE_OPTIMIZE_SCAN_WITH_NATIVE_READERS = "store.hive.optimize_scan_with_native_readers"; OptionValidator HIVE_OPTIMIZE_SCAN_WITH_NATIVE_READERS_VALIDATOR = - new BooleanValidator(HIVE_OPTIMIZE_SCAN_WITH_NATIVE_READERS, false); + new BooleanValidator(HIVE_OPTIMIZE_SCAN_WITH_NATIVE_READERS); String SLICE_TARGET = "planner.slice_target"; long SLICE_TARGET_DEFAULT = 100000l; - PositiveLongValidator SLICE_TARGET_OPTION = new PositiveLongValidator(SLICE_TARGET, Long.MAX_VALUE, - SLICE_TARGET_DEFAULT); + PositiveLongValidator SLICE_TARGET_OPTION = new PositiveLongValidator(SLICE_TARGET, Long.MAX_VALUE + ); String CAST_TO_NULLABLE_NUMERIC = "drill.exec.functions.cast_empty_string_to_null"; - BooleanValidator CAST_TO_NULLABLE_NUMERIC_OPTION = new BooleanValidator(CAST_TO_NULLABLE_NUMERIC, false); + BooleanValidator CAST_TO_NULLABLE_NUMERIC_OPTION = new BooleanValidator(CAST_TO_NULLABLE_NUMERIC); /** * HashTable runtime settings */ String MIN_HASH_TABLE_SIZE_KEY = "exec.min_hash_table_size"; - PositiveLongValidator MIN_HASH_TABLE_SIZE = new PositiveLongValidator(MIN_HASH_TABLE_SIZE_KEY, HashTable.MAXIMUM_CAPACITY, HashTable.DEFAULT_INITIAL_CAPACITY); + PositiveLongValidator MIN_HASH_TABLE_SIZE = new PositiveLongValidator(MIN_HASH_TABLE_SIZE_KEY, HashTable.MAXIMUM_CAPACITY); String MAX_HASH_TABLE_SIZE_KEY = "exec.max_hash_table_size"; - PositiveLongValidator MAX_HASH_TABLE_SIZE = new PositiveLongValidator(MAX_HASH_TABLE_SIZE_KEY, HashTable.MAXIMUM_CAPACITY, HashTable.MAXIMUM_CAPACITY); + PositiveLongValidator MAX_HASH_TABLE_SIZE = new PositiveLongValidator(MAX_HASH_TABLE_SIZE_KEY, HashTable.MAXIMUM_CAPACITY); /** * Limits the maximum level of parallelization to this factor time the number of Drillbits */ + String CPU_LOAD_AVERAGE_KEY = "planner.cpu_load_average"; + DoubleValidator CPU_LOAD_AVERAGE = new DoubleValidator(CPU_LOAD_AVERAGE_KEY); String MAX_WIDTH_PER_NODE_KEY = "planner.width.max_per_node"; - OptionValidator MAX_WIDTH_PER_NODE = new PositiveLongValidator(MAX_WIDTH_PER_NODE_KEY, Integer.MAX_VALUE, (long) Math.ceil(Runtime.getRuntime().availableProcessors() * 0.70)); + MaxWidthValidator MAX_WIDTH_PER_NODE = new MaxWidthValidator(MAX_WIDTH_PER_NODE_KEY); /** * The maximum level or parallelization any stage of the query can do. Note that while this @@ -319,19 +321,19 @@ public interface ExecConstants { * number of we want to do things like speed results return. */ String MAX_WIDTH_GLOBAL_KEY = "planner.width.max_per_query"; - OptionValidator MAX_WIDTH_GLOBAL = new PositiveLongValidator(MAX_WIDTH_GLOBAL_KEY, Integer.MAX_VALUE, 1000); + OptionValidator MAX_WIDTH_GLOBAL = new PositiveLongValidator(MAX_WIDTH_GLOBAL_KEY, Integer.MAX_VALUE); /** * Factor by which a node with endpoint affinity will be favored while creating assignment */ String AFFINITY_FACTOR_KEY = "planner.affinity_factor"; - OptionValidator AFFINITY_FACTOR = new DoubleValidator(AFFINITY_FACTOR_KEY, 1.2d); + OptionValidator AFFINITY_FACTOR = new DoubleValidator(AFFINITY_FACTOR_KEY); String EARLY_LIMIT0_OPT_KEY = "planner.enable_limit0_optimization"; - BooleanValidator EARLY_LIMIT0_OPT = new BooleanValidator(EARLY_LIMIT0_OPT_KEY, false); + BooleanValidator EARLY_LIMIT0_OPT = new BooleanValidator(EARLY_LIMIT0_OPT_KEY); String ENABLE_MEMORY_ESTIMATION_KEY = "planner.memory.enable_memory_estimation"; - OptionValidator ENABLE_MEMORY_ESTIMATION = new BooleanValidator(ENABLE_MEMORY_ESTIMATION_KEY, false); + OptionValidator ENABLE_MEMORY_ESTIMATION = new BooleanValidator(ENABLE_MEMORY_ESTIMATION_KEY); /** * Maximum query memory per node (in MB). Re-plan with cheaper operators if memory estimation exceeds this limit. @@ -340,7 +342,7 @@ public interface ExecConstants { */ String MAX_QUERY_MEMORY_PER_NODE_KEY = "planner.memory.max_query_memory_per_node"; LongValidator MAX_QUERY_MEMORY_PER_NODE = new RangeLongValidator( - MAX_QUERY_MEMORY_PER_NODE_KEY, 1024 * 1024, Long.MAX_VALUE, 2 * 1024 * 1024 * 1024L); + MAX_QUERY_MEMORY_PER_NODE_KEY, 1024 * 1024, Long.MAX_VALUE); /** * Minimum memory alocated to each buffered operator instance. @@ -349,7 +351,7 @@ public interface ExecConstants { */ String MIN_MEMORY_PER_BUFFERED_OP_KEY = "planner.memory.min_memory_per_buffered_op"; LongValidator MIN_MEMORY_PER_BUFFERED_OP = new RangeLongValidator( - MIN_MEMORY_PER_BUFFERED_OP_KEY, 1024 * 1024, Long.MAX_VALUE, 40 * 1024 * 1024L); + MIN_MEMORY_PER_BUFFERED_OP_KEY, 1024 * 1024, Long.MAX_VALUE); /** * Extra query memory per node for non-blocking operators. @@ -360,51 +362,51 @@ public interface ExecConstants { */ String NON_BLOCKING_OPERATORS_MEMORY_KEY = "planner.memory.non_blocking_operators_memory"; OptionValidator NON_BLOCKING_OPERATORS_MEMORY = new PowerOfTwoLongValidator( - NON_BLOCKING_OPERATORS_MEMORY_KEY, 1 << 11, 1 << 6); + NON_BLOCKING_OPERATORS_MEMORY_KEY, 1 << 11); String HASH_JOIN_TABLE_FACTOR_KEY = "planner.memory.hash_join_table_factor"; - OptionValidator HASH_JOIN_TABLE_FACTOR = new DoubleValidator(HASH_JOIN_TABLE_FACTOR_KEY, 1.1d); + OptionValidator HASH_JOIN_TABLE_FACTOR = new DoubleValidator(HASH_JOIN_TABLE_FACTOR_KEY); String HASH_AGG_TABLE_FACTOR_KEY = "planner.memory.hash_agg_table_factor"; - OptionValidator HASH_AGG_TABLE_FACTOR = new DoubleValidator(HASH_AGG_TABLE_FACTOR_KEY, 1.1d); + OptionValidator HASH_AGG_TABLE_FACTOR = new DoubleValidator(HASH_AGG_TABLE_FACTOR_KEY); String AVERAGE_FIELD_WIDTH_KEY = "planner.memory.average_field_width"; - OptionValidator AVERAGE_FIELD_WIDTH = new PositiveLongValidator(AVERAGE_FIELD_WIDTH_KEY, Long.MAX_VALUE, 8); + OptionValidator AVERAGE_FIELD_WIDTH = new PositiveLongValidator(AVERAGE_FIELD_WIDTH_KEY, Long.MAX_VALUE); - BooleanValidator ENABLE_QUEUE = new BooleanValidator("exec.queue.enable", false); - LongValidator LARGE_QUEUE_SIZE = new PositiveLongValidator("exec.queue.large", 1000, 10); - LongValidator SMALL_QUEUE_SIZE = new PositiveLongValidator("exec.queue.small", 100000, 100); + BooleanValidator ENABLE_QUEUE = new BooleanValidator("exec.queue.enable"); + LongValidator LARGE_QUEUE_SIZE = new PositiveLongValidator("exec.queue.large", 1000); + LongValidator SMALL_QUEUE_SIZE = new PositiveLongValidator("exec.queue.small", 100000); LongValidator QUEUE_THRESHOLD_SIZE = new PositiveLongValidator("exec.queue.threshold", - Long.MAX_VALUE, 30000000); + Long.MAX_VALUE); LongValidator QUEUE_TIMEOUT = new PositiveLongValidator("exec.queue.timeout_millis", - Long.MAX_VALUE, 60 * 1000 * 5); + Long.MAX_VALUE); String ENABLE_VERBOSE_ERRORS_KEY = "exec.errors.verbose"; - OptionValidator ENABLE_VERBOSE_ERRORS = new BooleanValidator(ENABLE_VERBOSE_ERRORS_KEY, false); + OptionValidator ENABLE_VERBOSE_ERRORS = new BooleanValidator(ENABLE_VERBOSE_ERRORS_KEY); String ENABLE_NEW_TEXT_READER_KEY = "exec.storage.enable_new_text_reader"; - OptionValidator ENABLE_NEW_TEXT_READER = new BooleanValidator(ENABLE_NEW_TEXT_READER_KEY, true); + OptionValidator ENABLE_NEW_TEXT_READER = new BooleanValidator(ENABLE_NEW_TEXT_READER_KEY); String BOOTSTRAP_STORAGE_PLUGINS_FILE = "bootstrap-storage-plugins.json"; String DRILL_SYS_FILE_SUFFIX = ".sys.drill"; String ENABLE_WINDOW_FUNCTIONS = "window.enable"; - OptionValidator ENABLE_WINDOW_FUNCTIONS_VALIDATOR = new BooleanValidator(ENABLE_WINDOW_FUNCTIONS, true); + OptionValidator ENABLE_WINDOW_FUNCTIONS_VALIDATOR = new BooleanValidator(ENABLE_WINDOW_FUNCTIONS); String DRILLBIT_CONTROL_INJECTIONS = "drill.exec.testing.controls"; OptionValidator DRILLBIT_CONTROLS_VALIDATOR = - new ExecutionControls.ControlsOptionValidator(DRILLBIT_CONTROL_INJECTIONS, ExecutionControls.DEFAULT_CONTROLS, 1); + new ExecutionControls.ControlsOptionValidator(DRILLBIT_CONTROL_INJECTIONS, 1); String NEW_VIEW_DEFAULT_PERMS_KEY = "new_view_default_permissions"; OptionValidator NEW_VIEW_DEFAULT_PERMS_VALIDATOR = - new StringValidator(NEW_VIEW_DEFAULT_PERMS_KEY, "700"); + new StringValidator(NEW_VIEW_DEFAULT_PERMS_KEY); String CTAS_PARTITIONING_HASH_DISTRIBUTE = "store.partition.hash_distribute"; - BooleanValidator CTAS_PARTITIONING_HASH_DISTRIBUTE_VALIDATOR = new BooleanValidator(CTAS_PARTITIONING_HASH_DISTRIBUTE, false); + BooleanValidator CTAS_PARTITIONING_HASH_DISTRIBUTE_VALIDATOR = new BooleanValidator(CTAS_PARTITIONING_HASH_DISTRIBUTE); String ENABLE_BULK_LOAD_TABLE_LIST_KEY = "exec.enable_bulk_load_table_list"; - BooleanValidator ENABLE_BULK_LOAD_TABLE_LIST = new BooleanValidator(ENABLE_BULK_LOAD_TABLE_LIST_KEY, false); + BooleanValidator ENABLE_BULK_LOAD_TABLE_LIST = new BooleanValidator(ENABLE_BULK_LOAD_TABLE_LIST_KEY); /** * When getting Hive Table information with exec.enable_bulk_load_table_list set to true, @@ -412,20 +414,20 @@ public interface ExecConstants { * at a time. (The number of tables can get to be quite large.) */ String BULK_LOAD_TABLE_LIST_BULK_SIZE_KEY = "exec.bulk_load_table_list.bulk_size"; - PositiveLongValidator BULK_LOAD_TABLE_LIST_BULK_SIZE = new PositiveLongValidator(BULK_LOAD_TABLE_LIST_BULK_SIZE_KEY, Integer.MAX_VALUE, 1000); + PositiveLongValidator BULK_LOAD_TABLE_LIST_BULK_SIZE = new PositiveLongValidator(BULK_LOAD_TABLE_LIST_BULK_SIZE_KEY, Integer.MAX_VALUE); /** * Option whose value is a comma separated list of admin usernames. Admin users are users who have special privileges * such as changing system options. */ String ADMIN_USERS_KEY = "security.admin.users"; - StringValidator ADMIN_USERS_VALIDATOR = new StringValidator(ADMIN_USERS_KEY, ImpersonationUtil.getProcessUserName(), true); + StringValidator ADMIN_USERS_VALIDATOR = new StringValidator(ADMIN_USERS_KEY, true); /** * Option whose value is a comma separated list of admin usergroups. */ String ADMIN_USER_GROUPS_KEY = "security.admin.user_groups"; - StringValidator ADMIN_USER_GROUPS_VALIDATOR = new StringValidator(ADMIN_USER_GROUPS_KEY, "", true); + StringValidator ADMIN_USER_GROUPS_VALIDATOR = new StringValidator(ADMIN_USER_GROUPS_KEY, true); /** * Option whose value is a string representing list of inbound impersonation policies. * @@ -440,16 +442,17 @@ public interface ExecConstants { */ String IMPERSONATION_POLICIES_KEY = "exec.impersonation.inbound_policies"; StringValidator IMPERSONATION_POLICY_VALIDATOR = - new InboundImpersonationManager.InboundImpersonationPolicyValidator(IMPERSONATION_POLICIES_KEY, "[]"); + new InboundImpersonationManager.InboundImpersonationPolicyValidator(IMPERSONATION_POLICIES_KEY); + /** * Web settings */ String WEB_LOGS_MAX_LINES = "web.logs.max_lines"; - OptionValidator WEB_LOGS_MAX_LINES_VALIDATOR = new PositiveLongValidator(WEB_LOGS_MAX_LINES, Integer.MAX_VALUE, 10000); + OptionValidator WEB_LOGS_MAX_LINES_VALIDATOR = new PositiveLongValidator(WEB_LOGS_MAX_LINES, Integer.MAX_VALUE); String CODE_GEN_EXP_IN_METHOD_SIZE = "exec.java.compiler.exp_in_method_size"; - LongValidator CODE_GEN_EXP_IN_METHOD_SIZE_VALIDATOR = new LongValidator(CODE_GEN_EXP_IN_METHOD_SIZE, 50); + LongValidator CODE_GEN_EXP_IN_METHOD_SIZE_VALIDATOR = new LongValidator(CODE_GEN_EXP_IN_METHOD_SIZE); /** * Timeout for create prepare statement request. If the request exceeds this timeout, then request is timed out. @@ -457,10 +460,10 @@ public interface ExecConstants { */ String CREATE_PREPARE_STATEMENT_TIMEOUT_MILLIS = "prepare.statement.create_timeout_ms"; OptionValidator CREATE_PREPARE_STATEMENT_TIMEOUT_MILLIS_VALIDATOR = - new PositiveLongValidator(CREATE_PREPARE_STATEMENT_TIMEOUT_MILLIS, Integer.MAX_VALUE, 10000); + new PositiveLongValidator(CREATE_PREPARE_STATEMENT_TIMEOUT_MILLIS, Integer.MAX_VALUE); String DYNAMIC_UDF_SUPPORT_ENABLED = "exec.udf.enable_dynamic_support"; - BooleanValidator DYNAMIC_UDF_SUPPORT_ENABLED_VALIDATOR = new BooleanValidator(DYNAMIC_UDF_SUPPORT_ENABLED, true, true); + BooleanValidator DYNAMIC_UDF_SUPPORT_ENABLED_VALIDATOR = new BooleanValidator(DYNAMIC_UDF_SUPPORT_ENABLED); /** * Option to save query profiles. If false, no query profile will be saved @@ -468,7 +471,7 @@ public interface ExecConstants { */ String ENABLE_QUERY_PROFILE_OPTION = "exec.query_profile.save"; BooleanValidator ENABLE_QUERY_PROFILE_VALIDATOR = new BooleanValidator( - ENABLE_QUERY_PROFILE_OPTION, true, false); + ENABLE_QUERY_PROFILE_OPTION); /** * Profiles are normally written after the last client message to reduce latency. @@ -478,16 +481,16 @@ public interface ExecConstants { */ String QUERY_PROFILE_DEBUG_OPTION = "exec.query_profile.debug_mode"; BooleanValidator QUERY_PROFILE_DEBUG_VALIDATOR = new BooleanValidator( - QUERY_PROFILE_DEBUG_OPTION, false, false); + QUERY_PROFILE_DEBUG_OPTION); String USE_DYNAMIC_UDFS_KEY = "exec.udf.use_dynamic"; - BooleanValidator USE_DYNAMIC_UDFS = new BooleanValidator(USE_DYNAMIC_UDFS_KEY, true); + BooleanValidator USE_DYNAMIC_UDFS = new BooleanValidator(USE_DYNAMIC_UDFS_KEY); String QUERY_TRANSIENT_STATE_UPDATE_KEY = "exec.query.progress.update"; - BooleanValidator QUERY_TRANSIENT_STATE_UPDATE = new BooleanValidator(QUERY_TRANSIENT_STATE_UPDATE_KEY, true); + BooleanValidator QUERY_TRANSIENT_STATE_UPDATE = new BooleanValidator(QUERY_TRANSIENT_STATE_UPDATE_KEY); String PERSISTENT_TABLE_UMASK = "exec.persistent_table.umask"; - StringValidator PERSISTENT_TABLE_UMASK_VALIDATOR = new StringValidator(PERSISTENT_TABLE_UMASK, "002"); + StringValidator PERSISTENT_TABLE_UMASK_VALIDATOR = new StringValidator(PERSISTENT_TABLE_UMASK); /** * Enables batch iterator (operator) validation. Validation is normally enabled @@ -496,7 +499,7 @@ public interface ExecConstants { * a "production" Drill instance. */ String ENABLE_ITERATOR_VALIDATION_OPTION = "debug.validate_iterators"; - BooleanValidator ENABLE_ITERATOR_VALIDATOR = new BooleanValidator(ENABLE_ITERATOR_VALIDATION_OPTION, false); + BooleanValidator ENABLE_ITERATOR_VALIDATOR = new BooleanValidator(ENABLE_ITERATOR_VALIDATION_OPTION); /** * Boot-time config option to enable validation. Primarily used for tests. @@ -511,7 +514,7 @@ public interface ExecConstants { * each batch passed to each iterator. */ String ENABLE_VECTOR_VALIDATION_OPTION = "debug.validate_vectors"; - BooleanValidator ENABLE_VECTOR_VALIDATOR = new BooleanValidator(ENABLE_VECTOR_VALIDATION_OPTION, false); + BooleanValidator ENABLE_VECTOR_VALIDATOR = new BooleanValidator(ENABLE_VECTOR_VALIDATION_OPTION); /** * Boot-time config option to enable vector validation. Primarily used for http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/compile/ClassCompilerSelector.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/compile/ClassCompilerSelector.java b/exec/java-exec/src/main/java/org/apache/drill/exec/compile/ClassCompilerSelector.java index 92b8430..9b6e86e 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/compile/ClassCompilerSelector.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/compile/ClassCompilerSelector.java @@ -75,12 +75,12 @@ public class ClassCompilerSelector { public static final String JAVA_COMPILER_OPTION = "exec.java_compiler"; public static final String JAVA_COMPILER_JANINO_MAXSIZE_OPTION = "exec.java_compiler_janino_maxsize"; - public static final OptionValidator JAVA_COMPILER_JANINO_MAXSIZE = new LongValidator(JAVA_COMPILER_JANINO_MAXSIZE_OPTION, 256*1024); + public static final OptionValidator JAVA_COMPILER_JANINO_MAXSIZE = new LongValidator(JAVA_COMPILER_JANINO_MAXSIZE_OPTION); public static final String JAVA_COMPILER_DEBUG_OPTION = "exec.java_compiler_debug"; - public static final OptionValidator JAVA_COMPILER_DEBUG = new BooleanValidator(JAVA_COMPILER_DEBUG_OPTION, true); + public static final OptionValidator JAVA_COMPILER_DEBUG = new BooleanValidator(JAVA_COMPILER_DEBUG_OPTION); - public static final StringValidator JAVA_COMPILER_VALIDATOR = new StringValidator(JAVA_COMPILER_OPTION, CompilerPolicy.DEFAULT.toString()) { + public static final StringValidator JAVA_COMPILER_VALIDATOR = new StringValidator(JAVA_COMPILER_OPTION) { @Override public void validate(final OptionValue v, final OptionSet manager) { super.validate(v, manager); http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/planner/fragment/SimpleParallelizer.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/fragment/SimpleParallelizer.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/fragment/SimpleParallelizer.java index c389e89..4584bd5 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/fragment/SimpleParallelizer.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/fragment/SimpleParallelizer.java @@ -72,7 +72,10 @@ public class SimpleParallelizer implements ParallelizationParameters { OptionManager optionManager = context.getOptions(); long sliceTarget = optionManager.getOption(ExecConstants.SLICE_TARGET).num_val; this.parallelizationThreshold = sliceTarget > 0 ? sliceTarget : 1; - this.maxWidthPerNode = optionManager.getOption(ExecConstants.MAX_WIDTH_PER_NODE_KEY).num_val.intValue(); + double cpu_load_average = optionManager.getOption(ExecConstants.CPU_LOAD_AVERAGE); + final long maxWidth = optionManager.getOption(ExecConstants.MAX_WIDTH_PER_NODE); + // compute the maxwidth + this.maxWidthPerNode = ExecConstants.MAX_WIDTH_PER_NODE.computeMaxWidth(cpu_load_average,maxWidth); this.maxGlobalWidth = optionManager.getOption(ExecConstants.MAX_WIDTH_GLOBAL_KEY).num_val.intValue(); this.affinityFactor = optionManager.getOption(ExecConstants.AFFINITY_FACTOR_KEY).float_val.intValue(); } http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/PlannerSettings.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/PlannerSettings.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/PlannerSettings.java index 15314ba..36285a5 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/PlannerSettings.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/PlannerSettings.java @@ -51,42 +51,42 @@ public class PlannerSettings implements Context{ // max off heap memory for planning (16G) private static final long MAX_OFF_HEAP_ALLOCATION_IN_BYTES = 16l * 1024 * 1024 * 1024; - public static final OptionValidator CONSTANT_FOLDING = new BooleanValidator("planner.enable_constant_folding", true); - public static final OptionValidator EXCHANGE = new BooleanValidator("planner.disable_exchanges", false); - public static final OptionValidator HASHAGG = new BooleanValidator("planner.enable_hashagg", true); - public static final OptionValidator STREAMAGG = new BooleanValidator("planner.enable_streamagg", true); - public static final OptionValidator HASHJOIN = new BooleanValidator("planner.enable_hashjoin", true); - public static final OptionValidator MERGEJOIN = new BooleanValidator("planner.enable_mergejoin", true); - public static final OptionValidator NESTEDLOOPJOIN = new BooleanValidator("planner.enable_nestedloopjoin", true); - public static final OptionValidator MULTIPHASE = new BooleanValidator("planner.enable_multiphase_agg", true); - public static final OptionValidator BROADCAST = new BooleanValidator("planner.enable_broadcast_join", true); - public static final OptionValidator BROADCAST_THRESHOLD = new PositiveLongValidator("planner.broadcast_threshold", MAX_BROADCAST_THRESHOLD, 10000000); - public static final OptionValidator BROADCAST_FACTOR = new RangeDoubleValidator("planner.broadcast_factor", 0, Double.MAX_VALUE, 1.0d); - public static final OptionValidator NESTEDLOOPJOIN_FACTOR = new RangeDoubleValidator("planner.nestedloopjoin_factor", 0, Double.MAX_VALUE, 100.0d); - public static final OptionValidator NLJOIN_FOR_SCALAR = new BooleanValidator("planner.enable_nljoin_for_scalar_only", true); - public static final OptionValidator JOIN_ROW_COUNT_ESTIMATE_FACTOR = new RangeDoubleValidator("planner.join.row_count_estimate_factor", 0, Double.MAX_VALUE, 1.0d); - public static final OptionValidator MUX_EXCHANGE = new BooleanValidator("planner.enable_mux_exchange", true); - public static final OptionValidator DEMUX_EXCHANGE = new BooleanValidator("planner.enable_demux_exchange", false); - public static final OptionValidator PARTITION_SENDER_THREADS_FACTOR = new LongValidator("planner.partitioner_sender_threads_factor", 2); - public static final OptionValidator PARTITION_SENDER_MAX_THREADS = new LongValidator("planner.partitioner_sender_max_threads", 8); - public static final OptionValidator PARTITION_SENDER_SET_THREADS = new LongValidator("planner.partitioner_sender_set_threads", -1); - public static final OptionValidator PRODUCER_CONSUMER = new BooleanValidator("planner.add_producer_consumer", false); - public static final OptionValidator PRODUCER_CONSUMER_QUEUE_SIZE = new LongValidator("planner.producer_consumer_queue_size", 10); - public static final OptionValidator HASH_SINGLE_KEY = new BooleanValidator("planner.enable_hash_single_key", true); - public static final OptionValidator HASH_JOIN_SWAP = new BooleanValidator("planner.enable_hashjoin_swap", true); - public static final OptionValidator HASH_JOIN_SWAP_MARGIN_FACTOR = new RangeDoubleValidator("planner.join.hash_join_swap_margin_factor", 0, 100, 10d); + public static final OptionValidator CONSTANT_FOLDING = new BooleanValidator("planner.enable_constant_folding"); + public static final OptionValidator EXCHANGE = new BooleanValidator("planner.disable_exchanges"); + public static final OptionValidator HASHAGG = new BooleanValidator("planner.enable_hashagg"); + public static final OptionValidator STREAMAGG = new BooleanValidator("planner.enable_streamagg"); + public static final OptionValidator HASHJOIN = new BooleanValidator("planner.enable_hashjoin"); + public static final OptionValidator MERGEJOIN = new BooleanValidator("planner.enable_mergejoin"); + public static final OptionValidator NESTEDLOOPJOIN = new BooleanValidator("planner.enable_nestedloopjoin"); + public static final OptionValidator MULTIPHASE = new BooleanValidator("planner.enable_multiphase_agg"); + public static final OptionValidator BROADCAST = new BooleanValidator("planner.enable_broadcast_join"); + public static final OptionValidator BROADCAST_THRESHOLD = new PositiveLongValidator("planner.broadcast_threshold", MAX_BROADCAST_THRESHOLD); + public static final OptionValidator BROADCAST_FACTOR = new RangeDoubleValidator("planner.broadcast_factor", 0, Double.MAX_VALUE); + public static final OptionValidator NESTEDLOOPJOIN_FACTOR = new RangeDoubleValidator("planner.nestedloopjoin_factor", 0, Double.MAX_VALUE); + public static final OptionValidator NLJOIN_FOR_SCALAR = new BooleanValidator("planner.enable_nljoin_for_scalar_only"); + public static final OptionValidator JOIN_ROW_COUNT_ESTIMATE_FACTOR = new RangeDoubleValidator("planner.join.row_count_estimate_factor", 0, Double.MAX_VALUE); + public static final OptionValidator MUX_EXCHANGE = new BooleanValidator("planner.enable_mux_exchange"); + public static final OptionValidator DEMUX_EXCHANGE = new BooleanValidator("planner.enable_demux_exchange"); + public static final OptionValidator PARTITION_SENDER_THREADS_FACTOR = new LongValidator("planner.partitioner_sender_threads_factor"); + public static final OptionValidator PARTITION_SENDER_MAX_THREADS = new LongValidator("planner.partitioner_sender_max_threads"); + public static final OptionValidator PARTITION_SENDER_SET_THREADS = new LongValidator("planner.partitioner_sender_set_threads"); + public static final OptionValidator PRODUCER_CONSUMER = new BooleanValidator("planner.add_producer_consumer"); + public static final OptionValidator PRODUCER_CONSUMER_QUEUE_SIZE = new LongValidator("planner.producer_consumer_queue_size"); + public static final OptionValidator HASH_SINGLE_KEY = new BooleanValidator("planner.enable_hash_single_key"); + public static final OptionValidator HASH_JOIN_SWAP = new BooleanValidator("planner.enable_hashjoin_swap"); + public static final OptionValidator HASH_JOIN_SWAP_MARGIN_FACTOR = new RangeDoubleValidator("planner.join.hash_join_swap_margin_factor", 0, 100); public static final String ENABLE_DECIMAL_DATA_TYPE_KEY = "planner.enable_decimal_data_type"; - public static final BooleanValidator ENABLE_DECIMAL_DATA_TYPE = new BooleanValidator(ENABLE_DECIMAL_DATA_TYPE_KEY, false); - public static final OptionValidator HEP_OPT = new BooleanValidator("planner.enable_hep_opt", true); - public static final OptionValidator HEP_PARTITION_PRUNING = new BooleanValidator("planner.enable_hep_partition_pruning", true); + public static final BooleanValidator ENABLE_DECIMAL_DATA_TYPE = new BooleanValidator(ENABLE_DECIMAL_DATA_TYPE_KEY); + public static final OptionValidator HEP_OPT = new BooleanValidator("planner.enable_hep_opt"); + public static final OptionValidator HEP_PARTITION_PRUNING = new BooleanValidator("planner.enable_hep_partition_pruning"); public static final OptionValidator PLANNER_MEMORY_LIMIT = new RangeLongValidator("planner.memory_limit", - INITIAL_OFF_HEAP_ALLOCATION_IN_BYTES, MAX_OFF_HEAP_ALLOCATION_IN_BYTES, DEFAULT_MAX_OFF_HEAP_ALLOCATION_IN_BYTES); + INITIAL_OFF_HEAP_ALLOCATION_IN_BYTES, MAX_OFF_HEAP_ALLOCATION_IN_BYTES); public static final String UNIONALL_DISTRIBUTE_KEY = "planner.enable_unionall_distribute"; - public static final BooleanValidator UNIONALL_DISTRIBUTE = new BooleanValidator(UNIONALL_DISTRIBUTE_KEY, false); + public static final BooleanValidator UNIONALL_DISTRIBUTE = new BooleanValidator(UNIONALL_DISTRIBUTE_KEY); public static final OptionValidator IDENTIFIER_MAX_LENGTH = new RangeLongValidator("planner.identifier_max_length", 128 /* A minimum length is needed because option names are identifiers themselves */, - Integer.MAX_VALUE, DEFAULT_IDENTIFIER_MAX_LENGTH); + Integer.MAX_VALUE); public static final DoubleValidator FILTER_MIN_SELECTIVITY_ESTIMATE_FACTOR = new MinRangeDoubleValidator("planner.filter.min_selectivity_estimate_factor", @@ -96,15 +96,15 @@ public class PlannerSettings implements Context{ 0.0, 1.0, 1.0d, "planner.filter.min_selectivity_estimate_factor"); public static final String TYPE_INFERENCE_KEY = "planner.enable_type_inference"; - public static final BooleanValidator TYPE_INFERENCE = new BooleanValidator(TYPE_INFERENCE_KEY, true); + public static final BooleanValidator TYPE_INFERENCE = new BooleanValidator(TYPE_INFERENCE_KEY); public static final LongValidator IN_SUBQUERY_THRESHOLD = - new PositiveLongValidator("planner.in_subquery_threshold", Integer.MAX_VALUE, 20); /* Same as Calcite's default IN List subquery size */ + new PositiveLongValidator("planner.in_subquery_threshold", Integer.MAX_VALUE); /* Same as Calcite's default IN List subquery size */ - public static final String PARQUET_ROWGROUP_FILTER_PUSHDOWN_PLANNING_KEY = "planner.store.parquet.rowgroup.filter.pushdown"; - public static final BooleanValidator PARQUET_ROWGROUP_FILTER_PUSHDOWN_PLANNING = new BooleanValidator(PARQUET_ROWGROUP_FILTER_PUSHDOWN_PLANNING_KEY, true); + public static final String PARQUET_ROWGROUP_FILTER_PUSHDOWN_PLANNING_KEY = "planner.store.parquet.rowgroup.filter.pushdown.enabled"; + public static final BooleanValidator PARQUET_ROWGROUP_FILTER_PUSHDOWN_PLANNING = new BooleanValidator(PARQUET_ROWGROUP_FILTER_PUSHDOWN_PLANNING_KEY); public static final String PARQUET_ROWGROUP_FILTER_PUSHDOWN_PLANNING_THRESHOLD_KEY = "planner.store.parquet.rowgroup.filter.pushdown.threshold"; public static final PositiveLongValidator PARQUET_ROWGROUP_FILTER_PUSHDOWN_PLANNING_THRESHOLD = new PositiveLongValidator(PARQUET_ROWGROUP_FILTER_PUSHDOWN_PLANNING_THRESHOLD_KEY, - Long.MAX_VALUE, 10000); + Long.MAX_VALUE); public static final String QUOTING_IDENTIFIERS_KEY = "planner.parser.quoting_identifiers"; public static final EnumeratedStringValidator QUOTING_IDENTIFIERS = new EnumeratedStringValidator( @@ -132,10 +132,10 @@ public class PlannerSettings implements Context{ Note: once hash and merge joins will allow non-equi join conditions, the need to turn off join optimization may go away. */ - public static final BooleanValidator JOIN_OPTIMIZATION = new BooleanValidator("planner.enable_join_optimization", true); + public static final BooleanValidator JOIN_OPTIMIZATION = new BooleanValidator("planner.enable_join_optimization"); // for testing purpose public static final String FORCE_2PHASE_AGGR_KEY = "planner.force_2phase_aggr"; - public static final BooleanValidator FORCE_2PHASE_AGGR = new BooleanValidator(FORCE_2PHASE_AGGR_KEY, false); + public static final BooleanValidator FORCE_2PHASE_AGGR = new BooleanValidator(FORCE_2PHASE_AGGR_KEY); public OptionManager options = null; public FunctionImplementationRegistry functionImplementationRegistry = null; http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java index e03a40c..bdf12dd 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java @@ -448,8 +448,8 @@ public class DefaultSqlHandler extends AbstractSqlHandler { log("Not enough memory for this plan", phyRelNode, logger, null); logger.debug("Re-planning without hash operations."); - queryOptions.setOption(OptionValue.createBoolean(OptionValue.OptionType.QUERY, PlannerSettings.HASHJOIN.getOptionName(), false)); - queryOptions.setOption(OptionValue.createBoolean(OptionValue.OptionType.QUERY, PlannerSettings.HASHAGG.getOptionName(), false)); + queryOptions.setOption(OptionValue.createBoolean(OptionValue.OptionType.QUERY, PlannerSettings.HASHJOIN.getOptionName(), false, OptionValue.OptionScope.QUERY)); + queryOptions.setOption(OptionValue.createBoolean(OptionValue.OptionType.QUERY, PlannerSettings.HASHAGG.getOptionName(), false, OptionValue.OptionScope.QUERY)); try { final RelNode relNode = transform(PlannerType.VOLCANO, PlannerPhase.PHYSICAL, drel, traits); http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/SetOptionHandler.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/SetOptionHandler.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/SetOptionHandler.java index f278989..95115f6 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/SetOptionHandler.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/SetOptionHandler.java @@ -31,6 +31,7 @@ import org.apache.drill.exec.planner.sql.DirectPlan; import org.apache.drill.exec.server.options.OptionManager; import org.apache.drill.exec.server.options.OptionValue; import org.apache.drill.exec.server.options.OptionValue.OptionType; +import org.apache.drill.exec.server.options.OptionValue.OptionScope; import org.apache.drill.exec.util.ImpersonationUtil; import org.apache.drill.exec.work.foreman.ForemanSetupException; import org.apache.calcite.sql.SqlLiteral; @@ -64,15 +65,19 @@ public class SetOptionHandler extends AbstractSqlHandler { final String scope = option.getScope(); final OptionValue.OptionType type; + final OptionValue.OptionScope optionScope; if (scope == null) { // No scope mentioned assumed SESSION type = OptionType.SESSION; + optionScope = OptionScope.SESSION; } else { switch (scope.toLowerCase()) { case "session": type = OptionType.SESSION; + optionScope = OptionScope.SESSION; break; case "system": type = OptionType.SYSTEM; + optionScope = OptionScope.SYSTEM; break; default: throw UserException.validationError() @@ -99,7 +104,7 @@ public class SetOptionHandler extends AbstractSqlHandler { // Currently, we convert multi-part identifier to a string. final String name = option.getName().toString(); if (value != null) { // SET option - final OptionValue optionValue = createOptionValue(name, type, (SqlLiteral) value); + final OptionValue optionValue = createOptionValue(name, type, (SqlLiteral) value, optionScope); options.setOption(optionValue); } else { // RESET option if ("ALL".equalsIgnoreCase(name)) { @@ -113,36 +118,36 @@ public class SetOptionHandler extends AbstractSqlHandler { } private static OptionValue createOptionValue(final String name, final OptionValue.OptionType type, - final SqlLiteral literal) { + final SqlLiteral literal, final OptionValue.OptionScope scope) { final Object object = literal.getValue(); final SqlTypeName typeName = literal.getTypeName(); switch (typeName) { case DECIMAL: { final BigDecimal bigDecimal = (BigDecimal) object; if (bigDecimal.scale() == 0) { - return OptionValue.createLong(type, name, bigDecimal.longValue()); + return OptionValue.createLong(type, name, bigDecimal.longValue(), scope); } else { - return OptionValue.createDouble(type, name, bigDecimal.doubleValue()); + return OptionValue.createDouble(type, name, bigDecimal.doubleValue(), scope); } } case DOUBLE: case FLOAT: - return OptionValue.createDouble(type, name, ((BigDecimal) object).doubleValue()); + return OptionValue.createDouble(type, name, ((BigDecimal) object).doubleValue(), scope); case SMALLINT: case TINYINT: case BIGINT: case INTEGER: - return OptionValue.createLong(type, name, ((BigDecimal) object).longValue()); + return OptionValue.createLong(type, name, ((BigDecimal) object).longValue(), scope); case VARBINARY: case VARCHAR: case CHAR: - return OptionValue.createString(type, name, ((NlsString) object).getValue()); + return OptionValue.createString(type, name, ((NlsString) object).getValue(), scope); case BOOLEAN: - return OptionValue.createBoolean(type, name, (Boolean) object); + return OptionValue.createBoolean(type, name, (Boolean) object, scope); default: throw UserException.validationError() http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/user/InboundImpersonationManager.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/user/InboundImpersonationManager.java b/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/user/InboundImpersonationManager.java index b64ed14..9c94065 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/user/InboundImpersonationManager.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/user/InboundImpersonationManager.java @@ -86,8 +86,8 @@ public class InboundImpersonationManager { */ public static class InboundImpersonationPolicyValidator extends StringValidator { - public InboundImpersonationPolicyValidator(String name, String def) { - super(name, def, true); + public InboundImpersonationPolicyValidator(String name) { + super(name, true); } @Override http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/user/UserSession.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/user/UserSession.java b/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/user/UserSession.java index fc647c8..c30d1b3 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/user/UserSession.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/user/UserSession.java @@ -41,6 +41,8 @@ import org.apache.drill.exec.proto.UserBitShared.UserCredentials; import org.apache.drill.exec.proto.UserProtos.UserProperties; import org.apache.drill.exec.server.options.OptionManager; import org.apache.drill.exec.server.options.OptionValue; +import org.apache.drill.exec.server.options.OptionValue.OptionScope; +import org.apache.drill.exec.server.options.OptionValue.OptionType; import org.apache.drill.exec.server.options.SessionOptionManager; import com.google.common.collect.Maps; @@ -247,8 +249,8 @@ public class UserSession implements AutoCloseable { * @param value option value */ public void setSessionOption(String name, String value) { - OptionValue.Kind optionKind = SystemOptionManager.getValidator(name).getKind(); - OptionValue optionValue = OptionValue.createOption(optionKind, OptionValue.OptionType.SESSION, name, value); + OptionValue.Kind optionKind = ((SessionOptionManager) sessionOptions).getFallbackOptionManager().getValidator(name).getKind(); + OptionValue optionValue = OptionValue.createOption(optionKind, OptionType.SESSION, name, value, OptionScope.SESSION); sessionOptions.setOption(optionValue); } http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java index 7ed9220..6f22b76 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java @@ -34,6 +34,7 @@ import org.apache.drill.exec.proto.CoordinationProtos.DrillbitEndpoint; import org.apache.drill.exec.server.options.OptionManager; import org.apache.drill.exec.server.options.OptionValue; import org.apache.drill.exec.server.options.OptionValue.OptionType; +import org.apache.drill.exec.server.options.OptionValue.OptionScope; import org.apache.drill.exec.server.rest.WebServer; import org.apache.drill.exec.service.ServiceEngine; import org.apache.drill.exec.store.StoragePluginRegistry; @@ -226,7 +227,7 @@ public class Drillbit implements AutoCloseable { } final OptionValue optionValue = OptionValue.createOption( - defaultValue.kind, OptionType.SYSTEM, optionName, optionString); + defaultValue.kind, OptionType.SYSTEM, optionName, optionString, OptionScope.SYSTEM); optionManager.setOption(optionValue); } } http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/server/DrillbitContext.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/DrillbitContext.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/DrillbitContext.java index 973b97c..fb3ccf8 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/DrillbitContext.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/DrillbitContext.java @@ -104,7 +104,7 @@ public class DrillbitContext implements AutoCloseable { this.reader = new PhysicalPlanReader(context.getConfig(), classpathScan, lpPersistence, endpoint, storagePlugins); this.operatorCreatorRegistry = new OperatorCreatorRegistry(classpathScan); - this.systemOptions = new SystemOptionManager(lpPersistence, provider); + this.systemOptions = new SystemOptionManager(lpPersistence, provider,context.getConfig()); this.functionRegistry = new FunctionImplementationRegistry(context.getConfig(), classpathScan, systemOptions); this.compiler = new CodeCompiler(context.getConfig(), systemOptions); http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/BaseOptionManager.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/BaseOptionManager.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/BaseOptionManager.java index 299b221..9eba2a3 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/BaseOptionManager.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/BaseOptionManager.java @@ -56,4 +56,5 @@ public abstract class BaseOptionManager implements OptionSet { public String getOption(StringValidator validator) { return getOptionSafe(validator).string_val; } + } http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/DrillConfigIterator.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/DrillConfigIterator.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/DrillConfigIterator.java index 34ebf80..2b3fdfc 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/DrillConfigIterator.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/DrillConfigIterator.java @@ -22,6 +22,7 @@ import java.util.Map.Entry; import org.apache.drill.common.config.DrillConfig; import org.apache.drill.exec.server.options.OptionValue.OptionType; +import org.apache.drill.exec.server.options.OptionValue.OptionScope; import com.typesafe.config.ConfigValue; @@ -57,17 +58,17 @@ public class DrillConfigIterator implements Iterable<OptionValue> { OptionValue optionValue = null; switch(cv.valueType()) { case BOOLEAN: - optionValue = OptionValue.createBoolean(OptionType.BOOT, name, (Boolean) cv.unwrapped()); + optionValue = OptionValue.createBoolean(OptionType.BOOT, name, (Boolean) cv.unwrapped(), OptionScope.BOOT); break; case LIST: case OBJECT: case STRING: - optionValue = OptionValue.createString(OptionType.BOOT, name, cv.render()); + optionValue = OptionValue.createString(OptionType.BOOT, name, cv.render(),OptionScope.BOOT); break; case NUMBER: - optionValue = OptionValue.createLong(OptionType.BOOT, name, ((Number) cv.unwrapped()).longValue()); + optionValue = OptionValue.createLong(OptionType.BOOT, name, ((Number) cv.unwrapped()).longValue(),OptionScope.BOOT); break; case NULL: http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/FallbackOptionManager.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/FallbackOptionManager.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/FallbackOptionManager.java index 373b0d2..301fa34 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/FallbackOptionManager.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/FallbackOptionManager.java @@ -108,7 +108,7 @@ public abstract class FallbackOptionManager extends BaseOptionManager implements @Override public void setOption(OptionValue value) { - final OptionValidator validator = SystemOptionManager.getValidator(value.name); + final OptionValidator validator = getSystemOptionManager().getValidator(value.name); validator.validate(value, this); // validate the option @@ -120,7 +120,7 @@ public abstract class FallbackOptionManager extends BaseOptionManager implements @Override public void deleteOption(final String name, final OptionType type) { - SystemOptionManager.getValidator(name); // ensure the option exists + getSystemOptionManager().getValidator(name); // ensure the option exists // fallback if unable to delete locally if (!deleteLocalOption(name, type)) { @@ -144,4 +144,27 @@ public abstract class FallbackOptionManager extends BaseOptionManager implements } return list; } + + public OptionManager getFallback() { + return fallback; + } + + /** + * {@link FragmentOptionManager} and {@link SessionOptionManager} use {@link SystemOptionManager} as the fall back + * manager so for both FragmentOptionManager and SessionOptionManager fallback is the SystemOptionManager so it is + * returned. But in case of {@link QueryOptionManager}, it uses {@link SessionOptionManager} as the fallback manager + * and since SessionOptionManager uses SystemOptionManager as fallback, SystemOptionManager can be fetched from the + * SessionOptionManager. + */ + public SystemOptionManager getSystemOptionManager() { + final SystemOptionManager systemOptionManager; + if(fallback instanceof SessionOptionManager) { + final SessionOptionManager sessionOptionManager = (SessionOptionManager) fallback; + systemOptionManager = sessionOptionManager.getFallbackOptionManager(); + } + else { + systemOptionManager = (SystemOptionManager) fallback; + } + return systemOptionManager; + } } http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/OptionValidator.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/OptionValidator.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/OptionValidator.java index 951cbc4..7122a19 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/OptionValidator.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/OptionValidator.java @@ -17,6 +17,7 @@ */ package org.apache.drill.exec.server.options; +import org.apache.drill.common.config.DrillConfig; import org.apache.drill.common.exceptions.UserException; import org.apache.drill.exec.server.options.OptionValue.Kind; @@ -28,7 +29,7 @@ public abstract class OptionValidator { // the error messages produced by the validator private final String optionName; private final boolean isAdminOption; - + public static final String OPTION_DEFAULTS_ROOT = "drill.exec.options."; /** By default, if admin option value is not specified, it would be set to false.*/ public OptionValidator(String optionName) { this(optionName, false); @@ -106,4 +107,11 @@ public abstract class OptionValidator { */ public abstract Kind getKind(); + /** + * Loads the default option value for this validator. + * + * @return default option value + */ + public abstract void loadDefault(DrillConfig bootConfig); + } http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/OptionValue.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/OptionValue.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/OptionValue.java index 3c07608..5883480 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/OptionValue.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/OptionValue.java @@ -22,14 +22,22 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.base.Preconditions; import org.apache.drill.exec.store.sys.PersistentStore; +import com.google.common.base.Preconditions; /** + * <p> * An {@link OptionValue option value} is used by an {@link OptionManager} to store a run-time setting. This setting, * for example, could affect a query in execution stage. Instances of this class are JSON serializable and can be stored * in a {@link PersistentStore persistent store} (see {@link SystemOptionManager#options}), or * in memory (see {@link InMemoryOptionManager#options}). + * </p> + *<p> OptionType defines the permission level of the option.If it can be set at System level or Session level or so on. + * Whereas OptionScope defines the scope at which the option is being set. If the option is being set at the BOOT time + * the scope of the option is BOOT. If it is set at SYSTEM level the scope is SYSTEM. Although they look similar there + * is a fine level which differentiates both of them which is at which level of hierarchy they can be set and + * at what at level of hierarchy they were actually set. + * </p> */ @JsonInclude(Include.NON_NULL) public class OptionValue implements Comparable<OptionValue> { @@ -42,6 +50,10 @@ public class OptionValue implements Comparable<OptionValue> { BOOLEAN, LONG, STRING, DOUBLE } + public enum OptionScope { + BOOT, SYSTEM, SESSION, QUERY + } + public final String name; public final Kind kind; public final OptionType type; @@ -49,33 +61,34 @@ public class OptionValue implements Comparable<OptionValue> { public final String string_val; public final Boolean bool_val; public final Double float_val; + public final OptionScope scope; - public static OptionValue createLong(OptionType type, String name, long val) { - return new OptionValue(Kind.LONG, type, name, val, null, null, null); + public static OptionValue createLong(OptionType type, String name, long val, OptionScope scope) { + return new OptionValue(Kind.LONG, type, name, val, null, null, null, scope); } - public static OptionValue createBoolean(OptionType type, String name, boolean bool) { - return new OptionValue(Kind.BOOLEAN, type, name, null, null, bool, null); + public static OptionValue createBoolean(OptionType type, String name, boolean bool, OptionScope scope) { + return new OptionValue(Kind.BOOLEAN, type, name, null, null, bool, null, scope); } - public static OptionValue createString(OptionType type, String name, String val) { - return new OptionValue(Kind.STRING, type, name, null, val, null, null); + public static OptionValue createString(OptionType type, String name, String val, OptionScope scope) { + return new OptionValue(Kind.STRING, type, name, null, val, null, null, scope); } - public static OptionValue createDouble(OptionType type, String name, double val) { - return new OptionValue(Kind.DOUBLE, type, name, null, null, null, val); + public static OptionValue createDouble(OptionType type, String name, double val, OptionScope scope) { + return new OptionValue(Kind.DOUBLE, type, name, null, null, null, val, scope); } - public static OptionValue createOption(Kind kind, OptionType type, String name, String val) { + public static OptionValue createOption(Kind kind, OptionType type, String name, String val, OptionScope scope) { switch (kind) { case BOOLEAN: - return createBoolean(type, name, Boolean.valueOf(val)); + return createBoolean(type, name, Boolean.valueOf(val), scope); case LONG: - return createLong(type, name, Long.valueOf(val)); + return createLong(type, name, Long.valueOf(val), scope); case STRING: - return createString(type, name, val); + return createString(type, name, val, scope); case DOUBLE: - return createDouble(type, name, Double.valueOf(val)); + return createDouble(type, name, Double.valueOf(val), scope); default: return null; } @@ -88,16 +101,17 @@ public class OptionValue implements Comparable<OptionValue> { @JsonProperty("num_val") Long num_val, @JsonProperty("string_val") String string_val, @JsonProperty("bool_val") Boolean bool_val, - @JsonProperty("float_val") Double float_val) { + @JsonProperty("float_val") Double float_val, + @JsonProperty("scope") OptionScope scope) { Preconditions.checkArgument(num_val != null || string_val != null || bool_val != null || float_val != null); this.kind = kind; this.type = type; this.name = name; - this.float_val = float_val; this.num_val = num_val; this.string_val = string_val; this.bool_val = bool_val; + this.scope = scope; } public String getName() { http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/SessionOptionManager.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/SessionOptionManager.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/SessionOptionManager.java index 38f8556..512c8e9 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/SessionOptionManager.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/SessionOptionManager.java @@ -61,7 +61,7 @@ public class SessionOptionManager extends InMemoryOptionManager { return false; } final String name = value.name; - final OptionValidator validator = SystemOptionManager.getValidator(name); // if set, validator must exist. + final OptionValidator validator = getFallbackOptionManager().getValidator(name); // if set, validator must exist. final boolean shortLived = validator.isShortLived(); if (shortLived) { final int start = session.getQueryCount() + 1; // start from the next query @@ -83,7 +83,7 @@ public class SessionOptionManager extends InMemoryOptionManager { final int start = shortLivedOptions.get(name).getLeft(); // option is not in effect if queryNumber < start if (queryNumber < start) { - return SystemOptionManager.getValidator(name).getDefault(); + return getFallbackOptionManager().getValidator(name).getDefault(); // reset if queryNumber <= end } else { options.remove(name); @@ -120,4 +120,10 @@ public class SessionOptionManager extends InMemoryOptionManager { boolean supportsOptionType(OptionType type) { return type == OptionType.SESSION; } + + /* Gets fallback manager and returns it as SystemOptionManager */ + public SystemOptionManager getFallbackOptionManager() { + final SystemOptionManager systemOptionManager = (SystemOptionManager) getFallback(); + return systemOptionManager; + } } http://git-wip-us.apache.org/repos/asf/drill/blob/a51c98b8/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/SystemOptionManager.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/SystemOptionManager.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/SystemOptionManager.java index 3392a21..d2dfc2a 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/SystemOptionManager.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/options/SystemOptionManager.java @@ -26,7 +26,9 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import com.typesafe.config.ConfigException; import org.apache.commons.collections.IteratorUtils; +import org.apache.drill.common.config.DrillConfig; import org.apache.drill.common.config.LogicalPlanPersistence; import org.apache.drill.common.exceptions.UserException; import org.apache.drill.common.map.CaseInsensitiveMap; @@ -48,12 +50,31 @@ import com.google.common.collect.Sets; * Only one instance of this class exists per drillbit. Options set at the system level affect the entire system and * persist between restarts. */ + +/** + * <p> All the system options are externalized into conf file. While adding a new system option + * a validator should be added and the default value for the option should be set in + * the conf files(example : drill-module.conf) under the namespace drill.exec.options. + * </p> + * + * <p> + * The SystemOptionManager loads all the validators and the default values for the options are + * fetched from the config. The validators are populated with the default values fetched from + * the config. If the option is not set in the conf files config option is missing exception + * will be thrown. + * </p> + * + * <p> + * If the option is set using ALTER, the value that is set will be returned. Else the default value + * that is loaded into validator from the config will be returned. + * </p> + */ + public class SystemOptionManager extends BaseOptionManager implements OptionManager, AutoCloseable { private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(SystemOptionManager.class); - private static final CaseInsensitiveMap<OptionValidator> VALIDATORS; - - static { + private CaseInsensitiveMap<OptionValidator> VALIDATORS; + public void populateValidators() { final OptionValidator[] validators = new OptionValidator[]{ PlannerSettings.CONSTANT_FOLDING, PlannerSettings.EXCHANGE, @@ -177,8 +198,9 @@ public class SystemOptionManager extends BaseOptionManager implements OptionMana ExecConstants.USE_DYNAMIC_UDFS, ExecConstants.QUERY_TRANSIENT_STATE_UPDATE, ExecConstants.PERSISTENT_TABLE_UMASK_VALIDATOR, - ExecConstants.ENABLE_ITERATOR_VALIDATOR, - ExecConstants.ENABLE_VECTOR_VALIDATOR + ExecConstants.CPU_LOAD_AVERAGE, + ExecConstants.ENABLE_VECTOR_VALIDATOR, + ExecConstants.ENABLE_ITERATOR_VALIDATOR }; final Map<String, OptionValidator> tmp = new HashMap<>(); for (final OptionValidator validator : validators) { @@ -194,6 +216,7 @@ public class SystemOptionManager extends BaseOptionManager implements OptionMana private final PersistentStoreProvider provider; + private final DrillConfig bootConfig; /** * Persistent store for options that have been changed from default. * NOTE: CRUD operations must use lowercase keys. @@ -201,10 +224,35 @@ public class SystemOptionManager extends BaseOptionManager implements OptionMana private PersistentStore<OptionValue> options; public SystemOptionManager(LogicalPlanPersistence lpPersistence, final PersistentStoreProvider provider) { + this(lpPersistence,provider,null); + } + + public SystemOptionManager(LogicalPlanPersistence lpPersistence, final PersistentStoreProvider provider, final DrillConfig bootConfig) { this.provider = provider; - this.config = PersistentStoreConfig.newJacksonBuilder(lpPersistence.getMapper(), OptionValue.class) - .name("sys.options") - .build(); + this.config = PersistentStoreConfig.newJacksonBuilder(lpPersistence.getMapper(), OptionValue.class) + .name("sys.options") + .build(); + this.bootConfig = bootConfig; + populateValidators(); + populateDefaultValues(); + + } + + /** + * Gets the {@link OptionValidator} associated with the name. + * + * @param name name of the option + * @return the associated validator + * @throws UserException - if the validator is not found + */ + public OptionValidator getValidator(final String name) { + final OptionValidator validator = VALIDATORS.get(name); + if (validator == null) { + throw UserException.validationError() + .message(String.format("The option '%s' does not exist.", name.toLowerCase())) + .build(logger); + } + return validator; } /** @@ -237,23 +285,6 @@ public class SystemOptionManager extends BaseOptionManager implements OptionMana return this; } - /** - * Gets the {@link OptionValidator} associated with the name. - * - * @param name name of the option - * @return the associated validator - * @throws UserException - if the validator is not found - */ - public static OptionValidator getValidator(final String name) { - final OptionValidator validator = VALIDATORS.get(name); - if (validator == null) { - throw UserException.validationError() - .message(String.format("The option '%s' does not exist.", name)) - .build(logger); - } - return validator; - } - @Override public Iterator<OptionValue> iterator() { final Map<String, OptionValue> buildList = CaseInsensitiveMap.newHashMap(); @@ -276,7 +307,7 @@ public class SystemOptionManager extends BaseOptionManager implements OptionMana return value; } - // otherwise, return default. + // If option is not set return the default set in the validator. final OptionValidator validator = getValidator(name); return validator.getDefault(); } @@ -288,7 +319,6 @@ public class SystemOptionManager extends BaseOptionManager implements OptionMana final OptionValidator validator = getValidator(name); validator.validate(value, this); // validate the option - if (options.get(name) == null && value.equals(validator.getDefault())) { return; // if the option is not overridden, ignore setting option to default } @@ -315,6 +345,19 @@ public class SystemOptionManager extends BaseOptionManager implements OptionMana } } + public void populateDefaultValues() { + + // populate the options from the config + final Map<String, OptionValidator> tmp = new HashMap<>(); + for (OptionValidator validator: VALIDATORS.values()) { + try { + validator.loadDefault(bootConfig); + } catch (ConfigException.Missing e) { + throw new IllegalStateException("Config Option is missing"+ validator.getOptionName()); + } + } + } + @Override public OptionList getOptionList() { return (OptionList) IteratorUtils.toList(iterator());