Skip to content

Commit

Permalink
Fix hanging issue when Bazel failed to upload action inputs (#16819)
Browse files Browse the repository at this point in the history
Fixes #16422.

Closes #16423.
Closes #16445.

Closes #16464.

PiperOrigin-RevId: 480896881
Change-Id: I33019dbe8a088410280759465100a512a0f61bc1
  • Loading branch information
coeuvre authored Nov 22, 2022
1 parent 42a3dbb commit b55f322
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -222,11 +222,6 @@ public void onComplete() {

@Override
public void onError(@NonNull Throwable e) {
Disposable d = uploadTask.disposable.get();
if (d != null && d.isDisposed()) {
return;
}

completion.onError(e);
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedMap;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListeningScheduledExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.common.util.concurrent.SettableFuture;
Expand Down Expand Up @@ -71,6 +73,7 @@
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
Expand Down Expand Up @@ -435,6 +438,29 @@ public void ensureInputsPresent_interruptedDuringUploadBlobs_cancelInProgressUpl
assertThat(remoteCache.casUploadCache.getFinishedTasks()).hasSize(2);
}

@Test
public void ensureInputsPresent_uploadFailed_propagateErrors() throws Exception {
RemoteCacheClient cacheProtocol = spy(new InMemoryCacheClient());
doAnswer(invocationOnMock -> Futures.immediateFailedFuture(new IOException("upload failed")))
.when(cacheProtocol)
.uploadBlob(any(), any(), any());
doAnswer(invocationOnMock -> Futures.immediateFailedFuture(new IOException("upload failed")))
.when(cacheProtocol)
.uploadFile(any(), any(), any());
RemoteExecutionCache remoteCache = spy(newRemoteExecutionCache(cacheProtocol));
Path path = fs.getPath("/execroot/foo");
FileSystemUtils.writeContentAsLatin1(path, "bar");
SortedMap<PathFragment, Path> inputs = ImmutableSortedMap.of(PathFragment.create("foo"), path);
MerkleTree merkleTree = MerkleTree.build(inputs, digestUtil);

IOException e =
Assert.assertThrows(
IOException.class,
() -> remoteCache.ensureInputsPresent(context, merkleTree, ImmutableMap.of(), false));

assertThat(e).hasMessageThat().contains("upload failed");
}

private InMemoryRemoteCache newRemoteCache() {
RemoteOptions options = Options.getDefaults(RemoteOptions.class);
return new InMemoryRemoteCache(options, digestUtil);
Expand Down

0 comments on commit b55f322

Please sign in to comment.