Skip to content

fix(kether): 修复异步上下文完成与线程切换#706

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

fix(kether): 修复异步上下文完成与线程切换#706
zhibeigg wants to merge 1 commit into
TabooLib:dev/6.3.0from
zhibeigg:fix/703-kether-async-context

Conversation

@zhibeigg

@zhibeigg zhibeigg commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

原有问题

Kether 异步上下文在异常、取消和线程切换方面存在三类问题:

  • 动作同步抛错、返回的 Future 异常完成或被取消时,Quest frame 没有完整传播终态,后续动作与父上下文可能继续等待。
  • RemoteQuestReader 的读取游标和反射状态可被多个线程同时访问,缺少串行化保护。
  • 计分板动作可能从 Kether 的异步执行线程直接访问 Bukkit/NMS 对象。

典型触发场景与后果

  • 脚本中的异步动作访问数据库、网络或用户代码并失败:脚本 Future 永久 pending,调用命令或任务无法结束。
  • 嵌套 frame 被取消后,子 Future 仍运行或后续动作继续执行:产生重复副作用和无法回收的任务。
  • 多线程复用远程脚本 Reader:读取位置互相覆盖,可能解析出错误 token 或抛出随机异常。
  • 异步 Kether 动作更新计分板:在 Bukkit/Folia 下触发异步线程访问异常,严重时导致状态竞态。

本 PR 修改

  • AbstractQuestContext 中统一传播动作的同步异常、异步异常和取消,并停止后续动作、反向取消仍在运行的 Future。
  • 串行化 RemoteQuestReader 的反射读取状态,避免共享游标竞态。
  • 将计分板 Bukkit/NMS 更新封送回平台同步调度线程,并传播调度失败、回调异常和取消状态。
  • 增加上下文生命周期、嵌套 Future 和远程读取并发测试。

修改目的

保证 Kether 脚本无论成功、失败还是取消都能可靠结束,同时遵守 Bukkit/Folia 的线程所有权要求,避免脚本挂死和跨线程平台访问。

兼容性与行为变化

  • 不修改公开 API 签名。
  • 脚本失败由“可能永久等待”改为“可观察的异常完成”。
  • 计分板动作可能由错误的异步立即执行改为正确线程上的调度执行。

验证

  • ./gradlew :module:minecraft:minecraft-kether:test --rerun-tasks --no-parallel
  • ./gradlew :module:minecraft:minecraft-kether:build --rerun-tasks --no-parallel
  • git diff --check

Refs #703

确保动作异常与取消能够结束上下文并回收运行任务,同时序列化远程读取并将计分板更新切回平台线程。
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