Skip to content

fix(core): 修复异步任务与资源生命周期#704

Open
zhibeigg wants to merge 1 commit into
TabooLib:dev/6.3.0from
zhibeigg:fix/703-core-async-resources
Open

fix(core): 修复异步任务与资源生命周期#704
zhibeigg wants to merge 1 commit into
TabooLib:dev/6.3.0from
zhibeigg:fix/703-core-async-resources

Conversation

@zhibeigg

@zhibeigg zhibeigg commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

原有问题

核心异步与资源工具中存在多条“任务已经失败,但调用方永远等不到终态”的路径:

  • SyncExecutor 包装的平台任务一旦抛出异常,异常只会逃逸到调度器,返回的 CompletableFuture 不会成功也不会异常完成。
  • 异步递归删除会在同一个有界线程池中继续提交子任务并等待结果,深层目录下可能出现线程池自等待;调用结束后执行器也可能长期存活。
  • 文件监听器、WatchService、下载流、Jar 输入流和重定位临时文件在异常或重复关闭路径中没有统一释放。
  • Throttle 的首次调用、零延迟参数以及完整 Int 随机区间存在边界计算错误。

典型触发场景与后果

  • 插件通过 Future 等待同步线程任务,而任务内部抛错:Future 永久 pending,后续加载、命令或脚本流程一直卡住。
  • 删除层级较深、文件较多的目录:工作线程互相等待,删除任务死锁;反复调用还可能积累后台线程。
  • Windows 上反复热重载、监听配置或下载依赖:未关闭的流和 WatchService 会锁住文件、占用句柄,导致更新、删除失败。
  • 使用零节流时间或完整整数范围生成随机数:出现首次调用被错误拦截、溢出或范围不完整。

本 PR 修改

  • 捕获同步调度任务中的所有异常,并让 Future 以 completeExceptionally 收敛;成功、失败和取消都只能完成一次。
  • 将递归删除改为单个根任务内遍历整棵目录树,不再让父子任务在同一有界线程池中互相等待,并明确关闭执行器。
  • 为文件监听、依赖解析、Jar 读取和临时文件增加幂等关闭及失败清理。
  • 修复空重定位缓存、Throttle 首次/零延迟语义和完整 Int 随机区间计算。
  • 增加 Future、目录树、Watcher、资源关闭、节流和随机边界回归测试。

修改目的

确保基础工具在成功、异常、取消和关闭路径上都能得到确定终态,避免永久等待、线程泄漏、文件句柄泄漏和边界输入错误向上层模块扩散。

兼容性与行为变化

  • 不修改公开方法签名。
  • 原本“静默挂起”的任务现在会通过 Future 明确返回异常。
  • deepDeleteAsyncfutures 集合记录整棵树对应的根任务,不再暴露内部递归子任务。

验证

  • ./gradlew :common:build :common-env:build :common-util:build :common-platform-api:build :common-legacy-api:build --rerun-tasks --no-parallel
  • ./gradlew :common:test :common-env:build :common-util:test :common-platform-api:test :common-legacy-api:test --rerun-tasks --no-parallel
  • git diff --check

Refs #703

确保 Future 异常可观察,消除递归删除死锁并可靠关闭文件监听与加载资源。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant