Have BES uploads fail gracefully if the BES is not reachable due to bad network connection.
PiperOrigin-RevId: 249268815
diff --git a/src/BUILD b/src/BUILD
index edd3b94..e3f5d64 100644
--- a/src/BUILD
+++ b/src/BUILD
@@ -435,6 +435,7 @@
"//src/main/cpp:srcs",
"//src/main/java/com/google/devtools/build/docgen:srcs",
"//src/main/java/com/google/devtools/build/lib:srcs",
+ "//src/main/java/com/google/devtools/build/lib/network:srcs",
"//src/main/java/com/google/devtools/build/skydoc:srcs",
"//src/main/java/com/google/devtools/build/skyframe:srcs",
"//src/main/java/com/google/devtools/common/options:srcs",
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index f289290..630f9e6 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -841,6 +841,7 @@
"//src/main/java/com/google/devtools/build/lib/buildeventservice",
"//src/main/java/com/google/devtools/build/lib/dynamic",
"//src/main/java/com/google/devtools/build/lib/metrics:metrics_module",
+ "//src/main/java/com/google/devtools/build/lib/network:connectivity",
"//src/main/java/com/google/devtools/build/lib/profiler/callcounts:callcounts_module",
"//src/main/java/com/google/devtools/build/lib/profiler/memory:allocationtracker_module",
"//src/main/java/com/google/devtools/build/lib/remote",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/Bazel.java b/src/main/java/com/google/devtools/build/lib/bazel/Bazel.java
index b02a1d6..f66ddc5 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/Bazel.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/Bazel.java
@@ -60,6 +60,7 @@
com.google.devtools.build.lib.dynamic.DynamicExecutionModule.class,
com.google.devtools.build.lib.bazel.rules.BazelRulesModule.class,
com.google.devtools.build.lib.bazel.rules.BazelStrategyModule.class,
+ com.google.devtools.build.lib.network.ConnectivityModule.class,
com.google.devtools.build.lib.buildeventservice.BazelBuildEventServiceModule.class,
com.google.devtools.build.lib.profiler.callcounts.CallcountsModule.class,
com.google.devtools.build.lib.profiler.memory.AllocationTrackerModule.class,
diff --git a/src/main/java/com/google/devtools/build/lib/buildeventservice/BUILD b/src/main/java/com/google/devtools/build/lib/buildeventservice/BUILD
index d2ab6ce..a49091f 100644
--- a/src/main/java/com/google/devtools/build/lib/buildeventservice/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/buildeventservice/BUILD
@@ -36,6 +36,8 @@
"//src/main/java/com/google/devtools/build/lib/buildeventstream",
"//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto",
"//src/main/java/com/google/devtools/build/lib/buildeventstream/transports",
+ "//src/main/java/com/google/devtools/build/lib/network:connectivity",
+ "//src/main/java/com/google/devtools/build/lib/network:connectivity_status",
"//src/main/java/com/google/devtools/build/lib/profiler",
"//src/main/java/com/google/devtools/build/lib/vfs",
"//src/main/java/com/google/devtools/common/options",
diff --git a/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceModule.java b/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceModule.java
index 4f8be1c..205031a 100644
--- a/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceModule.java
+++ b/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceModule.java
@@ -48,6 +48,9 @@
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.events.Reporter;
+import com.google.devtools.build.lib.network.ConnectivityStatus;
+import com.google.devtools.build.lib.network.ConnectivityStatus.Status;
+import com.google.devtools.build.lib.network.ConnectivityStatusProvider;
import com.google.devtools.build.lib.profiler.AutoProfiler;
import com.google.devtools.build.lib.runtime.BlazeCommandEventHandler;
import com.google.devtools.build.lib.runtime.BlazeModule;
@@ -128,6 +131,8 @@
@Nullable private String invocationId;
@Nullable private Reporter cmdLineReporter;
@Nullable private BuildEventStreamer streamer;
+ @Nullable private ConnectivityStatusProvider connectivityProvider;
+ private static final String CONNECTIVITY_CACHE_KEY = "BES";
protected BESOptionsT besOptions;
@@ -227,6 +232,15 @@
this.buildRequestId = cmdEnv.getBuildRequestId();
this.cmdLineReporter = cmdEnv.getReporter();
+ for (BlazeModule module : cmdEnv.getRuntime().getBlazeModules()) {
+ if (module instanceof ConnectivityStatusProvider) {
+ this.connectivityProvider = (ConnectivityStatusProvider) module;
+ break;
+ }
+ }
+ Preconditions.checkNotNull(
+ this.connectivityProvider, "No ConnectivityStatusProvider found in modules list");
+
OptionsParsingResult parsingResult = cmdEnv.getOptions();
this.besOptions = Preconditions.checkNotNull(parsingResult.getOptions(optionsClass()));
this.bepOptions =
@@ -576,6 +590,18 @@
constructAndReportIds();
+ ConnectivityStatus status = connectivityProvider.getStatus(CONNECTIVITY_CACHE_KEY);
+ if (status.status != Status.OK) {
+ clearBesClient();
+ String message =
+ String.format(
+ "Build Event Service uploads disabled due to a connectivity problem: %s",
+ status.toString());
+ cmdLineReporter.handle(Event.warn(message));
+ googleLogger.atWarning().log(message);
+ return null;
+ }
+
final BuildEventServiceClient besClient;
try {
besClient = getBesClient(besOptions, authTlsOptions);
diff --git a/src/main/java/com/google/devtools/build/lib/network/BUILD b/src/main/java/com/google/devtools/build/lib/network/BUILD
new file mode 100644
index 0000000..dbc730e
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/network/BUILD
@@ -0,0 +1,29 @@
+package(
+ default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+ name = "srcs",
+ srcs = glob(["*"]),
+)
+
+java_library(
+ name = "connectivity",
+ srcs = ["ConnectivityModule.java"],
+ deps = [
+ ":connectivity_status",
+ "//src/main/java/com/google/devtools/build/lib:runtime",
+ "//src/main/java/com/google/devtools/build/lib:util",
+ "//src/main/java/com/google/devtools/common/options",
+ "//third_party:guava",
+ ],
+)
+
+java_library(
+ name = "connectivity_status",
+ srcs = [
+ "ConnectivityStatus.java",
+ "ConnectivityStatusProvider.java",
+ ],
+ deps = ["//third_party:guava"],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
index 7e57e8b..fc20e45 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
@@ -466,6 +466,8 @@
@SuppressWarnings("unchecked")
public <T extends BlazeModule> T getBlazeModule(Class<T> moduleClass) {
+ // TODO(steinman): Change this to include subclasses, and clean up places where we're iterating
+ // through all the modules to find an instance of the superclass.
for (BlazeModule module : blazeModules) {
if (module.getClass() == moduleClass) {
return (T) module;