use of com.google.devtools.build.lib.actions.ActionInput in project bazel by bazelbuild.
the class SingleBuildFileCacheTest method testExceptionsCached.
@Test
public void testExceptionsCached() throws Exception {
ActionInput empty = ActionInputHelper.fromPath("/noexist");
IOException caught = null;
try {
underTest.getDigest(empty);
fail("non existent file should raise exception");
} catch (IOException expected) {
caught = expected;
}
try {
underTest.getSizeInBytes(empty);
fail("non existent file should raise exception.");
} catch (IOException expected) {
assertSame(caught, expected);
}
}
use of com.google.devtools.build.lib.actions.ActionInput in project bazel by bazelbuild.
the class SingleBuildFileCacheTest method testBasic.
@Test
public void testBasic() throws Exception {
ActionInput empty = ActionInputHelper.fromPath("/empty");
assertEquals(0, underTest.getSizeInBytes(empty));
byte[] digestBytes = underTest.getDigest(empty);
ByteString digest = ByteString.copyFromUtf8(BaseEncoding.base16().lowerCase().encode(digestBytes));
assertEquals(EMPTY_MD5, digest.toStringUtf8());
assertEquals("/empty", underTest.getInputFromDigest(digest).getExecPathString());
assert (underTest.contentsAvailableLocally(digest));
ByteString other = ByteString.copyFrom("f41d8cd98f00b204e9800998ecf8427e", "UTF-16");
assert (!underTest.contentsAvailableLocally(other));
assert (calls.containsKey("/empty"));
}
use of com.google.devtools.build.lib.actions.ActionInput in project bazel by bazelbuild.
the class SingleBuildFileCacheTest method testCache.
@Test
public void testCache() throws Exception {
ActionInput empty = ActionInputHelper.fromPath("/empty");
underTest.getDigest(empty);
assert (calls.containsKey("/empty"));
assertEquals(1, (int) calls.get("/empty"));
underTest.getDigest(empty);
assertEquals(1, (int) calls.get("/empty"));
}
use of com.google.devtools.build.lib.actions.ActionInput in project bazel by bazelbuild.
the class WorkerFilesHash method getWorkerFilesHash.
public static HashCode getWorkerFilesHash(Iterable<? extends ActionInput> toolFiles, ActionExecutionContext actionExecutionContext) throws IOException {
Hasher hasher = Hashing.sha256().newHasher();
for (ActionInput tool : toolFiles) {
hasher.putString(tool.getExecPathString(), Charset.defaultCharset());
hasher.putBytes(actionExecutionContext.getActionInputFileCache().getDigest(tool));
}
return hasher.hash();
}
use of com.google.devtools.build.lib.actions.ActionInput in project bazel by bazelbuild.
the class WorkerSpawnStrategy method actuallyExec.
private void actuallyExec(Spawn spawn, ActionExecutionContext actionExecutionContext, AtomicReference<Class<? extends SpawnActionContext>> writeOutputFiles) throws ExecException, InterruptedException {
Executor executor = actionExecutionContext.getExecutor();
EventHandler eventHandler = executor.getEventHandler();
if (executor.reportsSubcommands()) {
executor.reportSubcommand(spawn);
}
// We assume that the spawn to be executed always gets at least one @flagfile.txt or
// --flagfile=flagfile.txt argument, which contains the flags related to the work itself (as
// opposed to start-up options for the executed tool). Thus, we can extract those elements from
// its args and put them into the WorkRequest instead.
List<String> flagfiles = new ArrayList<>();
List<String> startupArgs = new ArrayList<>();
for (String arg : spawn.getArguments()) {
if (FLAG_FILE_PATTERN.matcher(arg).matches()) {
flagfiles.add(arg);
} else {
startupArgs.add(arg);
}
}
if (flagfiles.isEmpty()) {
throw new UserExecException(String.format(ERROR_MESSAGE_PREFIX + REASON_NO_FLAGFILE, spawn.getMnemonic()));
}
if (Iterables.isEmpty(spawn.getToolFiles())) {
throw new UserExecException(String.format(ERROR_MESSAGE_PREFIX + REASON_NO_TOOLS, spawn.getMnemonic()));
}
FileOutErr outErr = actionExecutionContext.getFileOutErr();
ImmutableList<String> args = ImmutableList.<String>builder().addAll(startupArgs).add("--persistent_worker").addAll(MoreObjects.firstNonNull(extraFlags.get(spawn.getMnemonic()), ImmutableList.<String>of())).build();
ImmutableMap<String, String> env = spawn.getEnvironment();
try {
ActionInputFileCache inputFileCache = actionExecutionContext.getActionInputFileCache();
HashCode workerFilesHash = WorkerFilesHash.getWorkerFilesHash(spawn.getToolFiles(), actionExecutionContext);
Map<PathFragment, Path> inputFiles = new SpawnHelpers(execRoot).getMounts(spawn, actionExecutionContext);
Set<PathFragment> outputFiles = SandboxHelpers.getOutputFiles(spawn);
WorkerKey key = new WorkerKey(args, env, execRoot, spawn.getMnemonic(), workerFilesHash, inputFiles, outputFiles, writeOutputFiles != null);
WorkRequest.Builder requestBuilder = WorkRequest.newBuilder();
for (String flagfile : flagfiles) {
expandArgument(requestBuilder, flagfile);
}
List<ActionInput> inputs = ActionInputHelper.expandArtifacts(spawn.getInputFiles(), actionExecutionContext.getArtifactExpander());
for (ActionInput input : inputs) {
byte[] digestBytes = inputFileCache.getDigest(input);
ByteString digest;
if (digestBytes == null) {
digest = ByteString.EMPTY;
} else {
digest = ByteString.copyFromUtf8(HashCode.fromBytes(digestBytes).toString());
}
requestBuilder.addInputsBuilder().setPath(input.getExecPathString()).setDigest(digest).build();
}
WorkResponse response = execInWorker(eventHandler, key, requestBuilder.build(), maxRetries, writeOutputFiles);
outErr.getErrorStream().write(response.getOutputBytes().toByteArray());
if (response.getExitCode() != 0) {
throw new UserExecException(String.format("Worker process sent response with exit code: %d.", response.getExitCode()));
}
} catch (IOException e) {
String message = CommandFailureUtils.describeCommandFailure(verboseFailures, spawn.getArguments(), env, execRoot.getPathString());
throw new UserExecException(message, e);
}
}
Aggregations