diff options
Diffstat (limited to 'src')
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" |