aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/buildeventstream/transports/FileTransport.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/buildeventstream/transports/FileTransport.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildeventstream/transports/FileTransport.java87
1 files changed, 46 insertions, 41 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/transports/FileTransport.java b/src/main/java/com/google/devtools/build/lib/buildeventstream/transports/FileTransport.java
index 540a7e84cd..c193ed094b 100644
--- a/src/main/java/com/google/devtools/build/lib/buildeventstream/transports/FileTransport.java
+++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/transports/FileTransport.java
@@ -17,7 +17,9 @@ package com.google.devtools.build.lib.buildeventstream.transports;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Function;
import com.google.common.base.Throwables;
+import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
@@ -39,7 +41,6 @@ import java.util.Set;
import java.util.function.Consumer;
import java.util.logging.Level;
import java.util.logging.Logger;
-import javax.annotation.Nullable;
/**
* Non-blocking file transport.
@@ -54,7 +55,6 @@ abstract class FileTransport implements BuildEventTransport {
private final BuildEventProtocolOptions options;
private final BuildEventArtifactUploader uploader;
private final Consumer<AbruptExitException> exitFunc;
- private boolean errored;
@VisibleForTesting
final AsynchronousFileOutputStream out;
@@ -111,57 +111,62 @@ abstract class FileTransport implements BuildEventTransport {
* a side effect. May return {@code null} if there was an interrupt. This method is not
* thread-safe.
*/
- @Nullable
- protected BuildEventStreamProtos.BuildEvent asStreamProto(
+ protected ListenableFuture<BuildEventStreamProtos.BuildEvent> asStreamProto(
BuildEvent event, ArtifactGroupNamer namer) {
checkNotNull(event);
- PathConverter pathConverter = uploadReferencedFiles(event.referencedLocalFiles());
- if (pathConverter == null) {
- return null;
- }
-
- BuildEventContext context =
- new BuildEventContext() {
- @Override
- public PathConverter pathConverter() {
- return pathConverter;
- }
-
- @Override
- public ArtifactGroupNamer artifactGroupNamer() {
- return namer;
- }
+ return Futures.transform(
+ uploadReferencedFiles(event.referencedLocalFiles()),
+ new Function<PathConverter, BuildEventStreamProtos.BuildEvent>() {
@Override
- public BuildEventProtocolOptions getOptions() {
- return options;
+ public BuildEventStreamProtos.BuildEvent apply(PathConverter pathConverter) {
+ BuildEventContext context =
+ new BuildEventContext() {
+ @Override
+ public PathConverter pathConverter() {
+ return pathConverter;
+ }
+
+ @Override
+ public ArtifactGroupNamer artifactGroupNamer() {
+ return namer;
+ }
+
+ @Override
+ public BuildEventProtocolOptions getOptions() {
+ return options;
+ }
+ };
+ return event.asStreamProto(context);
}
- };
- return event.asStreamProto(context);
+ },
+ MoreExecutors.directExecutor());
}
/**
* Returns a {@link PathConverter} for the uploaded files, or {@code null} when the uploaded
* failed.
*/
- private @Nullable PathConverter uploadReferencedFiles(Set<Path> artifacts) {
+ private ListenableFuture<PathConverter> uploadReferencedFiles(Set<Path> artifacts) {
checkNotNull(artifacts);
- if (errored) {
- return null;
- }
- try {
- return uploader.upload(artifacts);
- } catch (IOException e) {
- errored = true;
- exitFunc.accept(
- new AbruptExitException(
- Throwables.getStackTraceAsString(e), ExitCode.PUBLISH_ERROR, e));
- } catch (InterruptedException e) {
- errored = true;
- exitFunc.accept(new AbruptExitException(ExitCode.INTERRUPTED, e));
- Thread.currentThread().interrupt();
- }
- return null;
+ ListenableFuture<PathConverter> upload = uploader.upload(artifacts);
+ Futures.addCallback(
+ upload,
+ new FutureCallback<PathConverter>() {
+ @Override
+ public void onSuccess(PathConverter result) {
+ // Intentionally left empty.
+ }
+
+ @Override
+ public void onFailure(Throwable t) {
+ exitFunc.accept(
+ new AbruptExitException(
+ Throwables.getStackTraceAsString(t), ExitCode.PUBLISH_ERROR, t));
+ }
+ },
+ MoreExecutors.directExecutor());
+ return upload;
}
}