Add flag to toggle genquery result compression, on by default
Follow-up change to toggle the optimization added in https://github.com/bazelbuild/bazel/commit/6d63f8a1ad33490b97e60955277c4ebca40a4f48.
RELNOTES: None
PiperOrigin-RevId: 259388251
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/GenericRules.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/GenericRules.java
index 107faf5..0af7d9a 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/GenericRules.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/GenericRules.java
@@ -44,7 +44,7 @@
builder.addRuleDefinition(new AliasRule());
builder.addRuleDefinition(new BazelFilegroupRule());
builder.addRuleDefinition(new TestSuiteRule());
- builder.addRuleDefinition(new GenQueryRule());
+ GenQueryRule.register(builder);
builder.addRuleDefinition(new LabelBuildSettingRule());
builder.addRuleDefinition(new LabelBuildFlagRule());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
index 190aa39..dcfd3ba 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
@@ -378,8 +378,10 @@
throw new RuntimeException(e);
}
- // TODO(b/137379942): Enable compression.
- GenQueryOutputStream outputStream = new GenQueryOutputStream(/*compressionEnabled=*/ false);
+ GenQueryConfiguration genQueryConfig =
+ ruleContext.getConfiguration().getFragment(GenQueryConfiguration.class);
+ GenQueryOutputStream outputStream =
+ new GenQueryOutputStream(genQueryConfig.inMemoryCompressionEnabled());
try {
QueryOutputUtils
.output(queryOptions, queryResult, targets.getResult(), formatter, outputStream,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryConfiguration.java
new file mode 100644
index 0000000..335842e
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryConfiguration.java
@@ -0,0 +1,71 @@
+// Copyright 2018 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.rules.genquery;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
+import com.google.devtools.build.lib.analysis.config.FragmentOptions;
+import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
+import com.google.devtools.common.options.Option;
+import com.google.devtools.common.options.OptionDocumentationCategory;
+import com.google.devtools.common.options.OptionEffectTag;
+
+class GenQueryConfiguration extends BuildConfiguration.Fragment {
+
+ /** GenQuery-specific options. */
+ public static class GenQueryOptions extends FragmentOptions {
+ @Option(
+ name = "compress_in_memory_genquery_results",
+ defaultValue = "true",
+ documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+ effectTags = {OptionEffectTag.BAZEL_INTERNAL_CONFIGURATION},
+ help =
+ "If true, the in-memory representation of genquery results may be compressed as "
+ + "is necessary. Can save sufficient memory at the expense of more CPU usage.")
+ public boolean compressInMemoryResults;
+ }
+
+ static class Loader implements ConfigurationFragmentFactory {
+ @Override
+ public Fragment create(BuildOptions buildOptions) throws InvalidConfigurationException {
+ return new GenQueryConfiguration(
+ buildOptions.get(GenQueryOptions.class).compressInMemoryResults);
+ }
+
+ @Override
+ public Class<? extends Fragment> creates() {
+ return GenQueryConfiguration.class;
+ }
+
+ @Override
+ public ImmutableSet<Class<? extends FragmentOptions>> requiredOptions() {
+ return ImmutableSet.of(GenQueryOptions.class);
+ }
+ }
+
+ private final boolean inMemoryCompressionEnabled;
+
+ GenQueryConfiguration(boolean inMemoryCompressionEnabled) {
+ this.inMemoryCompressionEnabled = inMemoryCompressionEnabled;
+ }
+
+ /** Returns whether or not genquery stored in memory can be stored in compressed form. */
+ boolean inMemoryCompressionEnabled() {
+ return inMemoryCompressionEnabled;
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryRule.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryRule.java
index f32016b..5e6ca8d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryRule.java
@@ -21,6 +21,7 @@
import static com.google.devtools.build.lib.syntax.Type.STRING_LIST;
import com.google.devtools.build.lib.analysis.BaseRuleClasses;
+import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.RuleDefinition;
import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
import com.google.devtools.build.lib.packages.RuleClass;
@@ -29,9 +30,17 @@
* Rule definition for genquery the rule.
*/
public final class GenQueryRule implements RuleDefinition {
+
+ /** Adds {@link GenQueryRule} and its dependencies to the provided builder. */
+ public static void register(ConfiguredRuleClassProvider.Builder builder) {
+ builder.addConfigurationFragment(new GenQueryConfiguration.Loader());
+ builder.addRuleDefinition(new GenQueryRule());
+ }
+
@Override
public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) {
return builder
+ .requiresConfigurationFragments(GenQueryConfiguration.class)
/* <!-- #BLAZE_RULE(genquery).ATTRIBUTE(scope) -->
The scope of the query. The query is not allowed to touch targets outside the transitive
closure of these targets.