From afebc2ca695e609c8b19460e0a80085ce4b377de Mon Sep 17 00:00:00 2001 From: Thomas Tresansky Date: Tue, 20 Dec 2022 09:52:31 -0500 Subject: [PATCH 1/3] Use non-locking cache for default file ops --- .../internal/file/DefaultFileOperations.java | 22 +++++++++++++++++++ .../api/internal/file/FileOperations.java | 2 ++ .../classpath/DefaultClassSetAnalyzer.java | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/file/DefaultFileOperations.java b/subprojects/core/src/main/java/org/gradle/api/internal/file/DefaultFileOperations.java index ab0ec818892e..27e244a0c056 100755 --- a/subprojects/core/src/main/java/org/gradle/api/internal/file/DefaultFileOperations.java +++ b/subprojects/core/src/main/java/org/gradle/api/internal/file/DefaultFileOperations.java @@ -50,6 +50,7 @@ import org.gradle.api.tasks.WorkResult; import org.gradle.api.tasks.WorkResults; import org.gradle.api.tasks.util.PatternSet; +import org.gradle.cache.internal.DecompressionCache; import org.gradle.cache.internal.DecompressionCacheFactory; import org.gradle.internal.Cast; import org.gradle.internal.Factory; @@ -177,6 +178,27 @@ public FileTreeInternal zipTree(Object zipPath) { return new FileTreeAdapter(new ZipFileTree(fileProvider, fileSystem, directoryFileTreeFactory, fileHasher, decompressionCacheFactory.create()), taskDependencyFactory, patternSetFactory); } + @Override + public FileTreeInternal zipTreeNoLocking(Object zipPath) { + Provider fileProvider = asFileProvider(zipPath); + DecompressionCache nonLockingCache = new DecompressionCache() { + @Override + public File getBaseDir() { + return directoryFileTreeFactory.create(new File(fileProvider.get().getParentFile(), "non-locking-cache")).getDir(); + } + + @Override + public void useCache(Runnable action) { + action.run(); + } + + @Override + public void close() throws IOException {} + }; + + return new FileTreeAdapter(new ZipFileTree(fileProvider, fileSystem, directoryFileTreeFactory, fileHasher, nonLockingCache), taskDependencyFactory, patternSetFactory); + } + @Override public FileTreeInternal tarTree(Object tarPath) { Provider fileProvider = asFileProvider(tarPath); diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/file/FileOperations.java b/subprojects/core/src/main/java/org/gradle/api/internal/file/FileOperations.java index eb3d184d696b..5a0aee911fa1 100755 --- a/subprojects/core/src/main/java/org/gradle/api/internal/file/FileOperations.java +++ b/subprojects/core/src/main/java/org/gradle/api/internal/file/FileOperations.java @@ -65,6 +65,8 @@ public interface FileOperations { FileTree zipTree(Object zipPath); + FileTree zipTreeNoLocking(Object zipPath); + FileTree tarTree(Object tarPath); CopySpec copySpec(); diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/classpath/DefaultClassSetAnalyzer.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/classpath/DefaultClassSetAnalyzer.java index f5ebbcfa016b..d92b45a7450c 100644 --- a/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/classpath/DefaultClassSetAnalyzer.java +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/classpath/DefaultClassSetAnalyzer.java @@ -75,7 +75,7 @@ private ClassSetAnalysisData analyze(File classSet, boolean abiOnly) { private void visit(File classpathEntry, ClassDependentsAccumulator accumulator, boolean abiOnly) { if (hasExtension(classpathEntry, ".jar")) { - fileOperations.zipTree(classpathEntry).visit(new JarEntryVisitor(accumulator, abiOnly)); + fileOperations.zipTreeNoLocking(classpathEntry).visit(new JarEntryVisitor(accumulator, abiOnly)); } if (classpathEntry.isDirectory()) { fileOperations.fileTree(classpathEntry).visit(new DirectoryEntryVisitor(accumulator, abiOnly)); From 0ada3b9375403907cd7e6e923c98a6df9fa33f13 Mon Sep 17 00:00:00 2001 From: Thomas Tresansky Date: Tue, 20 Dec 2022 11:35:41 -0500 Subject: [PATCH 2/3] Use current scope to create noLocking cache - Move cache key to decompression cache interface, to use same name for locking vs. non-locking caches. --- .../api/internal/file/DefaultFileOperations.java | 12 +++++++++--- .../scopes/WorkerSharedProjectScopeServices.java | 7 +++++-- .../org/gradle/api/internal/file/TestFiles.java | 3 ++- .../gradle/cache/internal/DecompressionCache.java | 2 ++ .../cache/internal/DefaultDecompressionCache.java | 1 - 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/file/DefaultFileOperations.java b/subprojects/core/src/main/java/org/gradle/api/internal/file/DefaultFileOperations.java index 27e244a0c056..41dfee4a05d0 100755 --- a/subprojects/core/src/main/java/org/gradle/api/internal/file/DefaultFileOperations.java +++ b/subprojects/core/src/main/java/org/gradle/api/internal/file/DefaultFileOperations.java @@ -52,6 +52,7 @@ import org.gradle.api.tasks.util.PatternSet; import org.gradle.cache.internal.DecompressionCache; import org.gradle.cache.internal.DecompressionCacheFactory; +import org.gradle.cache.scopes.ScopedCache; import org.gradle.internal.Cast; import org.gradle.internal.Factory; import org.gradle.internal.file.Deleter; @@ -86,6 +87,7 @@ public class DefaultFileOperations implements FileOperations { private final TaskDependencyFactory taskDependencyFactory; private final ProviderFactory providers; private final DecompressionCacheFactory decompressionCacheFactory; + private final ScopedCache scopedCache; public DefaultFileOperations( FileResolver fileResolver, @@ -101,7 +103,8 @@ public DefaultFileOperations( DocumentationRegistry documentationRegistry, TaskDependencyFactory taskDependencyFactory, ProviderFactory providers, - DecompressionCacheFactory decompressionCacheFactory + DecompressionCacheFactory decompressionCacheFactory, + ScopedCache scopedCache ) { this.fileCollectionFactory = fileCollectionFactory; this.fileResolver = fileResolver; @@ -126,6 +129,7 @@ public DefaultFileOperations( this.fileSystem = fileSystem; this.deleter = deleter; this.decompressionCacheFactory = decompressionCacheFactory; + this.scopedCache = scopedCache; } @Override @@ -184,7 +188,7 @@ public FileTreeInternal zipTreeNoLocking(Object zipPath) { DecompressionCache nonLockingCache = new DecompressionCache() { @Override public File getBaseDir() { - return directoryFileTreeFactory.create(new File(fileProvider.get().getParentFile(), "non-locking-cache")).getDir(); + return directoryFileTreeFactory.create(scopedCache.baseDirForCrossVersionCache(DecompressionCache.EXPANSION_CACHE_KEY)).getDir(); } @Override @@ -321,6 +325,7 @@ public static DefaultFileOperations createSimple(FileResolver fileResolver, File ProviderFactory providers = services.get(ProviderFactory.class); TaskDependencyFactory taskDependencyFactory = services.get(TaskDependencyFactory.class); DecompressionCacheFactory decompressionCacheFactory = services.get(DecompressionCacheFactory.class); + ScopedCache scopedCache = services.get(ScopedCache.class); DefaultResourceHandler.Factory resourceHandlerFactory = DefaultResourceHandler.Factory.from( fileResolver, @@ -344,6 +349,7 @@ public static DefaultFileOperations createSimple(FileResolver fileResolver, File documentationRegistry, taskDependencyFactory, providers, - decompressionCacheFactory); + decompressionCacheFactory, + scopedCache); } } diff --git a/subprojects/core/src/main/java/org/gradle/internal/service/scopes/WorkerSharedProjectScopeServices.java b/subprojects/core/src/main/java/org/gradle/internal/service/scopes/WorkerSharedProjectScopeServices.java index 9c2ff24cc96a..45b0d5e2b5f6 100644 --- a/subprojects/core/src/main/java/org/gradle/internal/service/scopes/WorkerSharedProjectScopeServices.java +++ b/subprojects/core/src/main/java/org/gradle/internal/service/scopes/WorkerSharedProjectScopeServices.java @@ -49,6 +49,7 @@ import org.gradle.cache.internal.DecompressionCacheFactory; import org.gradle.cache.internal.scopes.DefaultProjectScopedCache; import org.gradle.cache.scopes.ProjectScopedCache; +import org.gradle.cache.scopes.ScopedCache; import org.gradle.internal.Factory; import org.gradle.internal.file.Deleter; import org.gradle.internal.hash.FileHasher; @@ -97,7 +98,8 @@ protected DefaultFileOperations createFileOperations( DocumentationRegistry documentationRegistry, ProviderFactory providers, TaskDependencyFactory taskDependencyFactory, - DecompressionCacheFactory decompressionCache + DecompressionCacheFactory decompressionCache, + ScopedCache scopedCache ) { return new DefaultFileOperations( fileResolver, @@ -113,7 +115,8 @@ protected DefaultFileOperations createFileOperations( documentationRegistry, taskDependencyFactory, providers, - decompressionCache); + decompressionCache, + scopedCache); } protected FileSystemOperations createFileSystemOperations(Instantiator instantiator, FileOperations fileOperations) { diff --git a/subprojects/core/src/testFixtures/groovy/org/gradle/api/internal/file/TestFiles.java b/subprojects/core/src/testFixtures/groovy/org/gradle/api/internal/file/TestFiles.java index b06b5a44a76e..2e004d022f7f 100644 --- a/subprojects/core/src/testFixtures/groovy/org/gradle/api/internal/file/TestFiles.java +++ b/subprojects/core/src/testFixtures/groovy/org/gradle/api/internal/file/TestFiles.java @@ -172,7 +172,8 @@ public static FileOperations fileOperations(File basedDir, TemporaryFileProvider documentationRegistry(), taskDependencyFactory(), providerFactory(), - TestCaches.decompressionCacheFactory(temporaryFileProvider.newTemporaryDirectory("cache-dir"))); + TestCaches.decompressionCacheFactory(temporaryFileProvider.newTemporaryDirectory("cache-dir")), + null); } public static ApiTextResourceAdapter.Factory textResourceAdapterFactory(@Nullable TemporaryFileProvider temporaryFileProvider) { diff --git a/subprojects/persistent-cache/src/main/java/org/gradle/cache/internal/DecompressionCache.java b/subprojects/persistent-cache/src/main/java/org/gradle/cache/internal/DecompressionCache.java index a624cf3ced8a..83072b49ed72 100644 --- a/subprojects/persistent-cache/src/main/java/org/gradle/cache/internal/DecompressionCache.java +++ b/subprojects/persistent-cache/src/main/java/org/gradle/cache/internal/DecompressionCache.java @@ -23,6 +23,8 @@ * A cache that can be used to store decompressed data extracted from archive files like zip and tars. */ public interface DecompressionCache extends Closeable { + String EXPANSION_CACHE_KEY = "expanded"; + /** * Returns the root directory used by this cache to store decompressed files. * diff --git a/subprojects/persistent-cache/src/main/java/org/gradle/cache/internal/DefaultDecompressionCache.java b/subprojects/persistent-cache/src/main/java/org/gradle/cache/internal/DefaultDecompressionCache.java index 6a90d0a5b881..dc62601e84bd 100644 --- a/subprojects/persistent-cache/src/main/java/org/gradle/cache/internal/DefaultDecompressionCache.java +++ b/subprojects/persistent-cache/src/main/java/org/gradle/cache/internal/DefaultDecompressionCache.java @@ -32,7 +32,6 @@ * are only permitted to one client at a time. The cache will be a Gradle cross version cache. */ public class DefaultDecompressionCache implements DecompressionCache { - private static final String EXPANSION_CACHE_KEY = "expanded"; private static final String EXPANSION_CACHE_NAME = "Compressed Files Expansion Cache"; private final PersistentCache cache; From 0ac0abec5cccabfc2b24273d39c45a142044d686 Mon Sep 17 00:00:00 2001 From: Thomas Tresansky Date: Tue, 20 Dec 2022 11:52:30 -0500 Subject: [PATCH 3/3] Provide missing arg to fix test --- .../gradle/api/internal/file/DefaultFileOperationsTest.groovy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/subprojects/core/src/test/groovy/org/gradle/api/internal/file/DefaultFileOperationsTest.groovy b/subprojects/core/src/test/groovy/org/gradle/api/internal/file/DefaultFileOperationsTest.groovy index 25db5aed1459..39347936655f 100755 --- a/subprojects/core/src/test/groovy/org/gradle/api/internal/file/DefaultFileOperationsTest.groovy +++ b/subprojects/core/src/test/groovy/org/gradle/api/internal/file/DefaultFileOperationsTest.groovy @@ -73,7 +73,8 @@ class DefaultFileOperationsTest extends Specification { TestFiles.documentationRegistry(), TestFiles.taskDependencyFactory(), TestUtil.providerFactory(), - TestCaches.decompressionCacheFactory(temporaryFileProvider.newTemporaryDirectory("cache")) + TestCaches.decompressionCacheFactory(temporaryFileProvider.newTemporaryDirectory("cache")), + null ) }