Remove --experimental_worker_allow_json_protocol
This flag has been flipped, and unlike other experimental flags there is no reason to disable it because workers can only support a single format at once, so if they rely on this, you just wouldn't be able to build.
Closes https://github.com/bazelbuild/bazel/issues/13599
Closes #14679.
PiperOrigin-RevId: 441738381
diff --git a/site/en/docs/creating-workers.md b/site/en/docs/creating-workers.md
index 292fb27..41d6901 100644
--- a/site/en/docs/creating-workers.md
+++ b/site/en/docs/creating-workers.md
@@ -9,9 +9,7 @@
persistent worker to perform these actions.
The Bazel server communicates with the worker using `stdin`/`stdout`. It
-supports the use of protocol buffers or JSON strings. Support for JSON is
-experimental and thus subject to change. It is guarded behind the
-`--experimental_worker_allow_json_protocol` flag.
+supports the use of protocol buffers or JSON strings.
The worker implementation has two parts:
diff --git a/site/en/docs/persistent-workers.md b/site/en/docs/persistent-workers.md
index 9417944..7a6120b 100644
--- a/site/en/docs/persistent-workers.md
+++ b/site/en/docs/persistent-workers.md
@@ -3,33 +3,34 @@
# Persistent Workers
-This page covers how to use persistent workers, the benefits, requirements,
-and how workers affect sandboxing.
+This page covers how to use persistent workers, the benefits, requirements, and
+how workers affect sandboxing.
A persistent worker is a long-running process started by the Bazel server, which
-functions as a _wrapper_ around the actual _tool_ (typically a compiler), or is
-the _tool_ itself. In order to benefit from persistent workers, the tool must
+functions as a *wrapper* around the actual *tool* (typically a compiler), or is
+the *tool* itself. In order to benefit from persistent workers, the tool must
support doing a sequence of compilations, and the wrapper needs to translate
between the tool's API and the request/response format described below. The same
-worker might be called with and without the `--persistent_worker` flag
-in the same build, and is responsible for appropriately starting and talking to
-the tool, as well as shutting down workers on exit. Each worker instance is
-assigned (but not chrooted to) a separate working directory under
+worker might be called with and without the `--persistent_worker` flag in the
+same build, and is responsible for appropriately starting and talking to the
+tool, as well as shutting down workers on exit. Each worker instance is assigned
+(but not chrooted to) a separate working directory under
`<outputBase>/bazel-workers`.
Using persistent workers is an
-[execution strategy](/docs/user-manual#execution-strategy)
-that decreases start-up overhead, allows more JIT compilation, and enables
-caching of for example the abstract syntax trees in the action execution. This
-strategy achieves these improvements by sending multiple requests to a
-long-running process.
+[execution strategy](/docs/user-manual#execution-strategy) that decreases
+start-up overhead, allows more JIT compilation, and enables caching of for
+example the abstract syntax trees in the action execution. This strategy
+achieves these improvements by sending multiple requests to a long-running
+process.
Persistent workers are implemented for multiple languages, including Java,
[Scala](https://github.com/bazelbuild/rules_scala){: .external},
[Kotlin](https://github.com/bazelbuild/rules_kotlin){: .external}, and more.
-Programs using a NodeJS runtime can use the [@bazel/worker](https://www.npmjs.com/package/@bazel/worker)
-helper library to implement the worker protocol.
+Programs using a NodeJS runtime can use the
+[@bazel/worker](https://www.npmjs.com/package/@bazel/worker) helper library to
+implement the worker protocol.
## Using persistent workers {:#usage}
@@ -38,23 +39,23 @@
execution takes precedence. For actions that do not support persistent workers,
Bazel falls back to starting a tool instance for each action. You can explicitly
set your build to use persistent workers by setting the `worker`
-[strategy](/docs/user-manual#execution-strategy) for the applicable tool mnemonics.
-As a best practice, this example includes specifying `local` as a fallback to
-the `worker` strategy:
+[strategy](/docs/user-manual#execution-strategy) for the applicable tool
+mnemonics. As a best practice, this example includes specifying `local` as a
+fallback to the `worker` strategy:
```posix-terminal
bazel build //{{ '<var>' }}my:target{{ '</var>' }} --strategy=Javac=worker,local
```
Using the workers strategy instead of the local strategy can boost compilation
-speed significantly, depending on implementation. For Java, builds can be
-2–4 times faster, sometimes more for incremental compilation. Compiling
-Bazel is about 2.5 times as fast with workers. For more details, see the
+speed significantly, depending on implementation. For Java, builds can be 2–4
+times faster, sometimes more for incremental compilation. Compiling Bazel is
+about 2.5 times as fast with workers. For more details, see the
"[Choosing number of workers](#number-of-workers)" section.
If you also have a remote build environment that matches your local build
environment, you can use the experimental
-[_dynamic_ strategy](https://blog.bazel.build/2019/02/01/dynamic-spawn-scheduler.html),
+[*dynamic* strategy](https://blog.bazel.build/2019/02/01/dynamic-spawn-scheduler.html){: .external},
which races a remote execution and a worker execution. To enable the dynamic
strategy, pass the
[--experimental_spawn_scheduler](/reference/command-line-reference#flag--experimental_spawn_scheduler)
@@ -72,8 +73,8 @@
targets will pay start-up costs of running non-JITted code and hitting cold
caches. If you have a small number of targets to build, a single worker may give
the best trade-off between compilation speed and resource usage (for example,
-see [issue #8586](https://github.com/bazelbuild/bazel/issues/8586){: .external}. The
-`worker_max_instances` flag sets the maximum number of worker instances per
+see [issue #8586](https://github.com/bazelbuild/bazel/issues/8586){: .external}.
+The `worker_max_instances` flag sets the maximum number of worker instances per
mnemonic and flag set (see below), so in a mixed system you could end up using
quite a lot of memory if you keep the default value. For incremental builds the
benefit of multiple worker instances is even smaller.
@@ -107,9 +108,8 @@
**Figure 2.** Graph of performance improvements of incremental builds.
-The speed-up depends on the change being made. A speed-up of a
-factor 6 is measured in the above situation when a commonly used constant
-is changed.
+The speed-up depends on the change being made. A speed-up of a factor 6 is
+measured in the above situation when a commonly used constant is changed.
## Modifying persistent workers {:#options}
@@ -137,17 +137,12 @@
inputs. Setting up the [sandbox](/docs/sandboxing) takes some extra time,
especially on macOS, but gives a better correctness guarantee.
-You can use the `--experimental_worker_allow_json_protocol` flag to allow
-workers to communicate with Bazel through JSON instead of protocol buffers
-(protobuf). The worker and the rule that consumes it can then be modified to
-support JSON.
-
The
[`--worker_quit_after_build`](/reference/command-line-reference#flag--worker_quit_after_build)
flag is mainly useful for debugging and profiling. This flag forces all workers
to quit once a build is done. You can also pass
-[`--worker_verbose`](/reference/command-line-reference#flag--worker_verbose) to get
-more output about what the workers are doing. This flag is reflected in the
+[`--worker_verbose`](/reference/command-line-reference#flag--worker_verbose) to
+get more output about what the workers are doing. This flag is reflected in the
`verbosity` field in `WorkRequest`, allowing worker implementations to also be
more verbose.
@@ -184,6 +179,7 @@
"supports-workers" : "1", "requires-worker-protocol" : "json" }
)
```
+
With this definition, the first use of this action would start with executing
the command line `/bin/some_compiler -max_mem=4G --persistent_worker`. A request
to compile `Foo.java` would then look like:
@@ -196,14 +192,12 @@
]
```
-The worker receives this on `stdin` in JSON format (because
-`requires-worker-protocol` is set to JSON, and
-`--experimental_worker_allow_json_protocol` is passed to the build to enable
-this option). The worker then performs the action, and sends a JSON-formatted
-`WorkResponse` to Bazel on its stdout. Bazel then parses this response and
-manually converts it to a `WorkResponse` proto. To communicate
-with the associated worker using binary-encoded protobuf instead of JSON,
-`requires-worker-protocol` would be set to `proto`, like this:
+The worker receives this on `stdin` in newline-delimited JSON format (because
+`requires-worker-protocol` is set to JSON). The worker then performs the action,
+and sends a JSON-formatted `WorkResponse` to Bazel on its stdout. Bazel then
+parses this response and manually converts it to a `WorkResponse` proto. To
+communicate with the associated worker using binary-encoded protobuf instead of
+JSON, `requires-worker-protocol` would be set to `proto`, like this:
```
execution_requirements = {
@@ -225,21 +219,24 @@
threads, if the underlying tool is multithreaded and the wrapper is set up to
understand this.
-In [this GitHub repo](https://github.com/Ubehebe/bazel-worker-examples){: .external}, you can
-see example worker wrappers written in Java as well as in Python. If you are
-working in JavaScript or TypeScript, the [@bazel/worker
-package](https://www.npmjs.com/package/@bazel/worker){: .external} and
+In
+[this GitHub repo](https://github.com/Ubehebe/bazel-worker-examples){: .external},
+you can see example worker wrappers written in Java as well as in Python. If you
+are working in JavaScript or TypeScript, the
+[@bazel/worker package](https://www.npmjs.com/package/@bazel/worker){: .external}
+and
[nodejs worker example](https://github.com/bazelbuild/rules_nodejs/tree/stable/examples/worker){: .external}
might be helpful.
## How do workers affect sandboxing? {:#sandboxing}
Using the `worker` strategy by default does not run the action in a
-[sandbox](/docs/sandboxing), similar to the `local` strategy. You can set
-the `--worker_sandboxing` flag to run all workers inside sandboxes, making sure
-each execution of the tool only sees the input files it's supposed to have. The
-tool may still leak information between requests internally, for instance
-through a cache. Using `dynamic` strategy [requires workers to be sandboxed](https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/exec/SpawnStrategyRegistry.java){: .external}.
+[sandbox](/docs/sandboxing), similar to the `local` strategy. You can set the
+`--worker_sandboxing` flag to run all workers inside sandboxes, making sure each
+execution of the tool only sees the input files it's supposed to have. The tool
+may still leak information between requests internally, for instance through a
+cache. Using `dynamic` strategy
+[requires workers to be sandboxed](https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/exec/SpawnStrategyRegistry.java){: .external}.
To allow correct use of compiler caches with workers, a digest is passed along
with each input file. Thus the compiler or the wrapper can check if the input is
@@ -259,9 +256,12 @@
For more information on persistent workers, see:
* [Original persistent workers blog post](https://blog.bazel.build/2015/12/10/java-workers.html)
-* [Haskell implementation description](https://www.tweag.io/blog/2019-09-25-bazel-ghc-persistent-worker-internship/){: .external}
-* [Blog post by Mike Morearty](https://medium.com/@mmorearty/how-to-create-a-persistent-worker-for-bazel-7738bba2cabb){: .external}
+* [Haskell implementation description](https://www.tweag.io/blog/2019-09-25-bazel-ghc-persistent-worker-internship/)
+ {: .external}
+* [Blog post by Mike Morearty](https://medium.com/@mmorearty/how-to-create-a-persistent-worker-for-bazel-7738bba2cabb)
+ {: .external}
* [Front End Development with Bazel: Angular/TypeScript and Persistent Workers
- w/ Asana](https://www.youtube.com/watch?v=0pgERydGyqo){: .external}
-* [Bazel strategies explained](https://jmmv.dev/2019/12/bazel-strategies.html)
-* [Informative worker strategy discussion on the bazel-discuss mailing list](https://groups.google.com/forum/#!msg/bazel-discuss/oAEnuhYOPm8/ol7hf4KWJgAJ){: .external}
+ w/ Asana](https://www.youtube.com/watch?v=0pgERydGyqo) {: .external}
+* [Bazel strategies explained](https://jmmv.dev/2019/12/bazel-strategies.html) {: .external}
+* [Informative worker strategy discussion on the bazel-discuss mailing list](https://groups.google.com/forum/#!msg/bazel-discuss/oAEnuhYOPm8/ol7hf4KWJgAJ)
+ {: .external}
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerOptions.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerOptions.java
index 1780854..94bb990 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerOptions.java
@@ -46,16 +46,6 @@
})
public Void experimentalPersistentJavac;
- @Option(
- name = "experimental_worker_allow_json_protocol",
- defaultValue = "true",
- documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
- effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS},
- help =
- "Allows workers to use the JSON worker protocol until it is determined to be"
- + " stable.")
- public boolean experimentalJsonWorkerProtocol;
-
/**
* 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),
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerParser.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerParser.java
index edef0c7..7a44a95 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerParser.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerParser.java
@@ -90,14 +90,6 @@
HashCode workerFilesCombinedHash = WorkerFilesHash.getCombinedHash(workerFiles);
- WorkerProtocolFormat protocolFormat = Spawns.getWorkerProtocolFormat(spawn);
- if (!workerOptions.experimentalJsonWorkerProtocol) {
- if (protocolFormat == WorkerProtocolFormat.JSON) {
- throw new IOException(
- "Persistent worker protocol format must be set to proto unless"
- + " --experimental_worker_allow_json_protocol is used");
- }
- }
WorkerKey key =
createWorkerKey(
spawn,
@@ -108,7 +100,7 @@
workerFiles,
workerOptions,
context.speculating(),
- protocolFormat);
+ Spawns.getWorkerProtocolFormat(spawn));
return new WorkerConfig(key, flagFiles);
}
diff --git a/src/test/shell/integration/bazel_worker_test.sh b/src/test/shell/integration/bazel_worker_test.sh
index d640216..098ed8e 100755
--- a/src/test/shell/integration/bazel_worker_test.sh
+++ b/src/test/shell/integration/bazel_worker_test.sh
@@ -35,7 +35,6 @@
add_to_bazelrc "build -s"
add_to_bazelrc "build --spawn_strategy=worker,standalone"
-add_to_bazelrc "build --experimental_worker_allow_json_protocol"
add_to_bazelrc "build --worker_verbose --worker_max_instances=1"
add_to_bazelrc "build --debug_print_action_contexts"
add_to_bazelrc "build --noexperimental_worker_multiplex"