diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java index a25a9faec7589a..61ba8004f0af44 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java @@ -803,7 +803,8 @@ public void beforeCommand(CommandEnvironment env) throws AbruptExitException { env.getWorkspaceName(), remoteOptions.remoteInstanceName, remoteOptions.remoteAcceptCached, - remoteOptions.remoteUploadLocalResults)); + remoteOptions.remoteUploadLocalResults, + verboseFailures)); if (env.getDirectories().getOutputBase().getFileSystem() instanceof RemoteExternalOverlayFileSystem remoteFs) { remoteFs.beforeCommand( diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteRepoContentsCacheImpl.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteRepoContentsCacheImpl.java index e71f3e5f6bba8f..546625c768606a 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteRepoContentsCacheImpl.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteRepoContentsCacheImpl.java @@ -24,6 +24,7 @@ import build.bazel.remote.execution.v2.Directory; import build.bazel.remote.execution.v2.Tree; import com.google.common.base.Splitter; +import com.google.common.base.Throwables; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.util.concurrent.Futures; @@ -93,6 +94,7 @@ public final class RemoteRepoContentsCacheImpl implements RemoteRepoContentsCach private final String commandId; private final boolean acceptCached; private final boolean uploadLocalResults; + private final boolean verboseFailures; private final DigestUtil digestUtil; private final Action baseAction; @@ -101,12 +103,14 @@ public RemoteRepoContentsCacheImpl( String buildRequestId, String commandId, boolean acceptCached, - boolean uploadLocalResults) { + boolean uploadLocalResults, + boolean verboseFailures) { this.buildRequestId = buildRequestId; this.commandId = commandId; this.cache = cache; this.acceptCached = acceptCached; this.uploadLocalResults = uploadLocalResults; + this.verboseFailures = verboseFailures; this.digestUtil = cache.digestUtil; this.baseAction = Action.newBuilder() @@ -142,7 +146,7 @@ public void addToCache( reporter.handle( Event.warn( "Failed to read marker file repo %s, skipping: %s" - .formatted(repoName, e.getMessage()))); + .formatted(repoName, maybeGetStackTrace(e)))); } var action = buildAction(predeclaredInputHash); var actionKey = new ActionKey(digestUtil.compute(action)); @@ -168,7 +172,7 @@ public void addToCache( reporter.handle( Event.warn( "Failed to upload repo contents to remote cache for repo %s: %s" - .formatted(repoName, e.getMessage()))); + .formatted(repoName, maybeGetStackTrace(e)))); } } @@ -179,6 +183,22 @@ public boolean lookupCache( String predeclaredInputHash, ExtendedEventHandler reporter) throws IOException, InterruptedException { + try { + return doLookupCache(repoName, repoDir, predeclaredInputHash, reporter); + } catch (IOException e) { + throw new IOException( + "Failed to look up repo %s in the remote repo contents cache: %s" + .formatted(repoName, maybeGetStackTrace(e)), + e); + } + } + + private boolean doLookupCache( + RepositoryName repoName, + Path repoDir, + String predeclaredInputHash, + ExtendedEventHandler reporter) + throws IOException, InterruptedException { if (!(repoDir.getFileSystem() instanceof RemoteExternalOverlayFileSystem remoteFs)) { return false; } @@ -236,7 +256,8 @@ public boolean lookupCache( markerFileContent = new String(markerFileContentFuture.get(), StandardCharsets.ISO_8859_1); repoDirectoryContent = repoDirectoryContentFuture.get(); } catch (ExecutionException e) { - throw new IllegalStateException("waitForBulkTransfer should have thrown", e); + throw new IllegalStateException( + "waitForBulkTransfer should have thrown: " + maybeGetStackTrace(e)); } var markerFileLines = Splitter.on('\n') @@ -285,6 +306,10 @@ private Action buildAction(String predeclaredInputHash) { .build(); } + private String maybeGetStackTrace(Exception e) { + return verboseFailures ? Throwables.getStackTraceAsString(e) : e.getMessage(); + } + private record RepoRemotePathResolver(Path fetchedRepoMarkerFile, Path fetchedRepoDir) implements RemotePathResolver { diff --git a/src/main/java/com/google/devtools/build/lib/remote/RepositoryRemoteHelpersFactoryImpl.java b/src/main/java/com/google/devtools/build/lib/remote/RepositoryRemoteHelpersFactoryImpl.java index 305d8531cbb464..57843e27d38629 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RepositoryRemoteHelpersFactoryImpl.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RepositoryRemoteHelpersFactoryImpl.java @@ -31,6 +31,7 @@ class RepositoryRemoteHelpersFactoryImpl implements RepositoryRemoteHelpersFacto private final String remoteInstanceName; private final boolean acceptCached; private final boolean uploadLocalResults; + private final boolean verboseFailures; RepositoryRemoteHelpersFactoryImpl( CombinedCache cache, @@ -40,7 +41,8 @@ class RepositoryRemoteHelpersFactoryImpl implements RepositoryRemoteHelpersFacto String workspaceName, String remoteInstanceName, boolean acceptCached, - boolean uploadLocalResults) { + boolean uploadLocalResults, + boolean verboseFailures) { this.cache = cache; this.remoteExecutor = remoteExecutor; this.buildRequestId = buildRequestId; @@ -49,6 +51,7 @@ class RepositoryRemoteHelpersFactoryImpl implements RepositoryRemoteHelpersFacto this.remoteInstanceName = remoteInstanceName; this.acceptCached = acceptCached; this.uploadLocalResults = uploadLocalResults; + this.verboseFailures = verboseFailures; } @Nullable @@ -72,6 +75,6 @@ public RepositoryRemoteExecutor createExecutor() { @Override public RemoteRepoContentsCache createRepoContentsCache() { return new RemoteRepoContentsCacheImpl( - cache, buildRequestId, commandId, acceptCached, uploadLocalResults); + cache, buildRequestId, commandId, acceptCached, uploadLocalResults, verboseFailures); } }