| // Copyright 2015 The Bazel Authors. All rights reserved. |
| // |
| // Licensed 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. |
| package com.google.devtools.build.lib.worker; |
| |
| import com.google.common.collect.Maps; |
| import com.google.devtools.build.lib.util.ResourceConverter; |
| import com.google.devtools.common.options.Converter; |
| import com.google.devtools.common.options.Converters; |
| import com.google.devtools.common.options.Option; |
| import com.google.devtools.common.options.OptionDocumentationCategory; |
| import com.google.devtools.common.options.OptionEffectTag; |
| import com.google.devtools.common.options.Options; |
| import com.google.devtools.common.options.OptionsBase; |
| import com.google.devtools.common.options.OptionsParsingException; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Map.Entry; |
| |
| /** |
| * Options related to worker processes. |
| */ |
| public class WorkerOptions extends OptionsBase { |
| public static final WorkerOptions DEFAULTS = Options.getDefaults(WorkerOptions.class); |
| |
| @Option( |
| name = "experimental_persistent_javac", |
| defaultValue = "null", |
| documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| help = "Enable the experimental persistent Java compiler.", |
| expansion = { |
| "--strategy=Javac=worker", |
| "--strategy=JavaIjar=local", |
| "--strategy=JavaDeployJar=local", |
| "--strategy=JavaSourceJar=local", |
| "--strategy=Turbine=local" |
| } |
| ) |
| public Void experimentalPersistentJavac; |
| |
| /** |
| * Defines a resource converter for named values in the form [name=]value, where the value is |
| * {@link ResourceConverter.FLAG_SYNTAX}. If no name is provided (used when setting a default), |
| * the empty string is used as the key. The default value for unspecified mnemonics is {@value |
| * DEFAULT_VALUE}. "auto" currently returns the default. |
| */ |
| public static class MultiResourceConverter implements Converter<Entry<String, Integer>> { |
| |
| static ResourceConverter valueConverter; |
| |
| public static final int DEFAULT_VALUE = 4; |
| |
| public MultiResourceConverter() { |
| valueConverter = new ResourceConverter(() -> DEFAULT_VALUE, 0, Integer.MAX_VALUE); |
| } |
| |
| @Override |
| public Map.Entry<String, Integer> convert(String input) throws OptionsParsingException { |
| // TODO(steinman): Make auto value return a reasonable multiplier of host capacity. |
| int pos = input.indexOf('='); |
| if (pos < 0) { |
| return Maps.immutableEntry("", valueConverter.convert(input)); |
| } |
| String name = input.substring(0, pos); |
| String value = input.substring(pos + 1); |
| return Maps.immutableEntry(name, valueConverter.convert(value)); |
| } |
| |
| @Override |
| public String getTypeDescription() { |
| return "[name=]value, where value is " + ResourceConverter.FLAG_SYNTAX; |
| } |
| } |
| |
| @Option( |
| name = "worker_max_instances", |
| converter = MultiResourceConverter.class, |
| defaultValue = "auto", |
| documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| help = |
| "How many instances of a worker process (like the persistent Java compiler) may be " |
| + "launched if you use the 'worker' strategy. May be specified as [name=value] to " |
| + "give a different value per worker mnemonic. Takes" |
| + ResourceConverter.FLAG_SYNTAX |
| + ". 'auto' calculates a reasonable default based on machine capacity." |
| + "\"=value\" sets a default for unspecified mnemonics.", |
| allowMultiple = true) |
| public List<Map.Entry<String, Integer>> workerMaxInstances; |
| |
| @Option( |
| name = "high_priority_workers", |
| defaultValue = "", |
| documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| help = |
| "Mnemonics of workers to run with high priority. When high priority workers are running " |
| + "all other workers are throttled.", |
| allowMultiple = true) |
| public List<String> highPriorityWorkers; |
| |
| @Option( |
| name = "worker_quit_after_build", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| help = "If enabled, all workers quit after a build is done." |
| ) |
| public boolean workerQuitAfterBuild; |
| |
| @Option( |
| name = "worker_verbose", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| help = "If enabled, prints verbose messages when workers are started, shutdown, ..." |
| ) |
| public boolean workerVerbose; |
| |
| @Option( |
| name = "worker_extra_flag", |
| converter = Converters.AssignmentConverter.class, |
| defaultValue = "", |
| documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| help = |
| "Extra command-flags that will be passed to worker processes in addition to " |
| + "--persistent_worker, keyed by mnemonic (e.g. --worker_extra_flag=Javac=--debug.", |
| allowMultiple = true) |
| public List<Map.Entry<String, String>> workerExtraFlags; |
| |
| @Option( |
| name = "worker_sandboxing", |
| defaultValue = "false", |
| documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, |
| effectTags = {OptionEffectTag.UNKNOWN}, |
| help = "If enabled, workers will be executed in a sandboxed environment." |
| ) |
| public boolean workerSandboxing; |
| |
| } |