From dd8fe7719809f5731f3fc824464ff0c930cd5053 Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Thu, 25 Nov 2021 11:23:06 +0100 Subject: [PATCH] Delete marker file before fetching an external repository (#14324) Fetching a repository is a long-running operation that can easily be interrupted. If it is and the marker file exists on disk, a new evaluation of the RepositoryDelegatorFunction may treat this repository as valid even though it is in an inconsistent state. Clearing the marker file before initiating the fetch and only recreating it after the fetch is complete prevents this scenario. Fixes #8993. Closes #14302. PiperOrigin-RevId: 412101756 --- .../lib/rules/repository/RepositoryDelegatorFunction.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java index 32e49f3d934900..37f467b2cc72de 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java @@ -271,6 +271,11 @@ && managedDirectoriesExist(directories.getWorkspace(), managedDirectories)) { } if (isFetch.get()) { + // Fetching a repository is a long-running operation that can easily be interrupted. If it is + // and the marker file exists on disk, a new call of this method may treat this repository as + // valid even though it is in an inconsistent state. Clear the marker file and only recreate + // it after fetching is done to prevent this scenario. + DigestWriter.clearMarkerFile(directories, repositoryName); // Fetching enabled, go ahead. RepositoryDirectoryValue.Builder builder = fetchRepository(skyKey, repoRoot, env, digestWriter.getMarkerData(), handler, rule);