Class LoomCacheService
- All Implemented Interfaces:
org.gradle.api.services.BuildService<org.gradle.api.services.BuildServiceParameters.None>
在 JVM 内按 key 去重,并叠加跨进程文件锁,使同一缓存条目的生产在「单 daemon --parallel」与 「多 daemon」下都串行化。读已发布缓存的路径由调用方自身的存在性检查无锁完成,无需经过此服务。
-
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic Duration共享缓存锁的默认等待超时.static org.gradle.api.provider.Provider<LoomCacheService> get(org.gradle.api.Project project) 返回当前 Loom classloader 对应的缓存服务.<T> AsyncCache<T> getAsyncCache(String cacheName) 返回当前 Loom classloader 作用域内按名称共享的异步缓存.static StringmodDepsKey(File rootDir, String mappingsIdentifier) mod 依赖重映射写 LOCAL 共享remapped_mods缓存时的互斥 key(按根项目目录 + mappings 标识分).void在按 key 取得的「JVM 监视器 + 跨进程文件锁」保护下执行一个互斥动作.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.gradle.api.services.BuildService
getParameters
-
Field Details
-
NAME
- See Also:
-
-
Constructor Details
-
LoomCacheService
public LoomCacheService()
-
-
Method Details
-
getAsyncCache
返回当前 Loom classloader 作用域内按名称共享的异步缓存.调用方必须保证同一名称始终使用同一种值类型。服务注册名包含 classloader 身份, 因而不会读取另一插件 classloader 创建的强类型缓存实例。
-
runExclusive
public void runExclusive(Path lockRoot, String key, Duration timeout, Callable<Void> action) throws Exception 在按 key 取得的「JVM 监视器 + 跨进程文件锁」保护下执行一个互斥动作.读路径应由调用方自身的存在性检查无锁完成;仅在判定需要生产时才调用本方法取锁。 各 provider 以
shouldRefreshOutputs/Files.exists作为无锁快路径, 配合产物的原子发布(写入即完整),保证读方不会看到半成品。- Parameters:
lockRoot- 锁文件目录key- 互斥 keytimeout- 等待跨进程锁的超时时间action- 取得锁后执行的动作- Throws:
Exception
-
defaultTimeout
共享缓存锁的默认等待超时.可通过系统属性
fabric.loom.lock.timeout.minutes覆盖 (在 gradle.properties 中写systemProp.fabric.loom.lock.timeout.minutes=10)。 未配置时:CI 上 1 分钟(不太可能解锁),本地 30 分钟(容忍首次冷构建的慢速下载, 但避免在异常持有者上无限等待——配合等待日志中的持有者 PID 可手动处置)。 -
modDepsKey
mod 依赖重映射写 LOCAL 共享remapped_mods缓存时的互斥 key(按根项目目录 + mappings 标识分).同一 checkout 的多个并发构建(如同时跑 client 与 server)共享该 key、串行化写入; 不同 checkout 根目录不同 → key 不同 → 互不阻塞。两处写入点(ModProcessor / SourceRemapper) 用同一助手生成 key,避免写法漂移。
-
get
public static org.gradle.api.provider.Provider<LoomCacheService> get(org.gradle.api.Project project) 返回当前 Loom classloader 对应的缓存服务.同一 Gradle root 可能通过约定插件和直接插件加载多份 Loom。注册名包含当前 classloader 身份,避免从另一 loader 取得不可强转的服务实现;同一 loader 的多个 子项目仍共享服务和内存缓存。跨 daemon 正确性继续由
CacheEntryLock保证。
-