diff options
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.java | 87 |
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; } } |