aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/worker/WorkerModule.java11
-rwxr-xr-xsrc/test/shell/integration/bazel_worker_test.sh24
3 files changed, 51 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
index 368529e804..466c3f94d6 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
@@ -102,6 +102,21 @@ public final class CleanCommand implements BlazeCommand {
public boolean async;
}
+ /**
+ * Posted on the public event stream to announce that a clean is happening.
+ */
+ public static class CleanStartingEvent {
+ private final OptionsProvider optionsProvider;
+
+ public CleanStartingEvent(OptionsProvider optionsProvider) {
+ this.optionsProvider = optionsProvider;
+ }
+
+ public OptionsProvider getOptionsProvider() {
+ return optionsProvider;
+ }
+ }
+
private static Logger LOG = Logger.getLogger(CleanCommand.class.getName());
@Override
@@ -152,7 +167,9 @@ public final class CleanCommand implements BlazeCommand {
+ asyncName
+ " if the clean takes more than several minutes.";
+ env.getEventBus().post(new CleanStartingEvent(options));
env.getReporter().handle(Event.info(null/*location*/, cleanBanner));
+
try {
String symlinkPrefix = options.getOptions(BuildRequest.BuildRequestOptions.class)
.getSymlinkPrefix(env.getRuntime().getProductName());
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerModule.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerModule.java
index e575d8204b..ddd07ad36c 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerModule.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerModule.java
@@ -24,6 +24,7 @@ import com.google.devtools.build.lib.exec.ExecutorBuilder;
import com.google.devtools.build.lib.runtime.BlazeModule;
import com.google.devtools.build.lib.runtime.Command;
import com.google.devtools.build.lib.runtime.CommandEnvironment;
+import com.google.devtools.build.lib.runtime.commands.CleanCommand.CleanStartingEvent;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.common.options.OptionsBase;
@@ -54,6 +55,16 @@ public class WorkerModule extends BlazeModule {
}
@Subscribe
+ public void cleanStarting(CleanStartingEvent event) {
+ if (workerPool != null) {
+ this.options = event.getOptionsProvider().getOptions(WorkerOptions.class);
+ workerFactory.setReporter(env.getReporter());
+ workerFactory.setOptions(options);
+ shutdownPool("Clean command is running, shutting down worker pool...");
+ }
+ }
+
+ @Subscribe
public void buildStarting(BuildStartingEvent event) {
options = event.getRequest().getOptions(WorkerOptions.class);
diff --git a/src/test/shell/integration/bazel_worker_test.sh b/src/test/shell/integration/bazel_worker_test.sh
index c65594798d..84705beb9b 100755
--- a/src/test/shell/integration/bazel_worker_test.sh
+++ b/src/test/shell/integration/bazel_worker_test.sh
@@ -44,7 +44,8 @@ function set_up() {
BINS=$(bazel info $PRODUCT_NAME-bin)/${WORKSPACE_SUBDIR}
# This causes Bazel to shut down all running workers.
- bazel build --worker_quit_after_build &> $TEST_log
+ bazel build --worker_quit_after_build &> $TEST_log \
+ || fail "'bazel build --worker_quit_after_build' during test set_up failed"
}
function write_hello_library_files() {
@@ -501,4 +502,25 @@ EOF
&& fail "environment variable leaked into worker env" || true
}
+function test_workers_quit_on_clean() {
+ prepare_example_worker
+ cat >>BUILD <<EOF
+work(
+ name = "hello_clean",
+ worker = ":worker",
+ args = ["hello clean"],
+)
+EOF
+
+ bazel build :hello_clean &> $TEST_log \
+ || fail "build failed"
+ assert_equals "hello clean" "$(cat $BINS/hello_clean.out)"
+ expect_log "Created new ${WORKER_TYPE_LOG_STRING} Work worker (id [0-9]\+)"
+
+ bazel clean &> $TEST_log \
+ || fail "clean failed"
+ expect_log "Clean command is running, shutting down worker pool..."
+ expect_log "Destroying Work worker (id [0-9]\+)"
+}
+
run_suite "Worker integration tests"