Skip to content

fix(proxy): 避免动态代理生成争用全局类池 - #368

Merged
zhou-hao merged 1 commit into
hs-web:5.0.xfrom
kyouji:codex/fast-bean-copier-classpool-fix
Sep 23, 2026
Merged

zhou-hao merged 1 commit into
hs-web:5.0.xfrom
kyouji:codex/fast-bean-copier-classpool-fix

Conversation

@kyouji

@kyouji kyouji commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

目的

  • 修复本地冷启动阶段多个 FastBeanCopier 同时生成代理时,竞争 Javassist 默认全局 ClassPool 锁导致请求长时间等待的问题。
  • 使不同代理的首次字节码生成互不阻塞。

核心变动

  • 模块 / 文件:hsweb-core 的 Proxy 及 FastBeanCopierColdStartContentionTest。
  • 行为变化:每个 Proxy 使用独立 ClassPool;类生成完成后清空仅用于生成的 CtClass 引用。
  • 边界或约束变化:生成后的 Proxy 仍可反复实例化已定义的目标类;不能再修改已生成的字节码模型。
  • 阶段提交:3d7cfeaff fix(proxy): 避免动态代理生成争用全局类池

设计与测试目标

  • 任务契约:不适用:针对已定位的框架内部锁竞争进行最小修复。
  • 权威文档:不适用:长期公开契约未变。
  • 用户确认:已确认。
  • 测试目标:覆盖 16 线程并发首次创建不同 Map -> Bean Copier、字段复制正确性、既有 FastBeanCopier 回归及 hsweb-core 全量单元测试。
  • 注释 / 公共契约:不适用:未新增 SPI 或公共 API;生成后模型不可再编辑的保护有代码内异常信息。
  • 数据权限:不适用。
  • 数据库兼容与性能:不适用:不涉及 SQL 或数据库。
  • 链路追踪:不适用:不涉及请求链路、外部 I/O 或异步业务流。
  • MBean 运维可观测性:不适用:不新增常驻缓存、队列、任务或执行器。
  • 系统性求解:适用:违反的不变量是并发首次生成不应因无关类型组合串行等待;共同根因是 Javassist 默认全局 ClassPool。通过独立池移除共享锁,16 线程冷启动回归测试覆盖原场景,既有复制测试覆盖兼容回归。

测试结果

  • 测试命令:./mvnw.cmd -pl hsweb-core '-Dtest=FastBeanCopierColdStartContentionTest,FastBeanCopierTest' test
  • 证据来源与复用判断:最终提交前的本地阶段验证;提交仅固化已验证 tree,相关生产代码、测试、依赖及构建配置未变化,证据有效。
  • 新增/更新测试:新增 FastBeanCopierColdStartContentionTest;16 个线程同步触发不同类型组合的首次复制,检查无 worker 阻塞在 javassist.ClassPool,并校验复制字段。
  • 单元测试:定向 15 项通过,0 failures / 0 errors / 0 skipped,耗时 22.081 秒;./mvnw.cmd -pl hsweb-core test 全量 63 项通过,0 failures / 0 errors / 0 skipped,耗时 36.101 秒。
  • 集成测试结果或不适用原因:不适用:变更仅覆盖本地 Javassist 代理生成,不涉及数据库、消息、网络或启动装配。
  • 压力测试结果或不适用原因:不适用:新增 16 线程并发冷启动回归测试用于验证锁竞争;未声明吞吐或延迟基准。
  • 覆盖率:JaCoCo 在两次 Maven 测试中执行并分析 hsweb-core(100 classes),当前模块未保留可供提取的行/分支覆盖率报告;以定向并发回归和全量 63 项单测作为替代验证。

文档同步情况

  • 已同步:不适用。
  • 未同步:无。
  • 说明:该修复不改变公开 API 或配置;测试证据保留在 PR 与 CI。

风险与说明

  • 影响范围:hsweb-core 动态代理生成与 FastBeanCopier 首次生成路径。
  • 兼容性与发布边界:不涉及已发布兼容性;生成后的 Proxy 仅保留已定义的目标类,符合原有生成后不可继续编辑的生命周期。
  • 注释 / 公共契约:不涉及新增 SPI 或公共 API。
  • 数据库兼容与 SQL 性能:不涉及。
  • 链路追踪 / 可观测性:不涉及。
  • MBean / 运维可观测性:不涉及。
  • 未覆盖场景:未在完整 JetLinks 运行时以真实接口压测;框架模块单测已覆盖原锁竞争与既有复制功能。
  • 已知限制:每种新的源/目标类组合首次生成仍会产生其自身的字节码生成开销,但不再竞争全局 ClassPool。
  • 回滚方式:回退提交 3d7cfeaff。

@zhou-hao
zhou-hao merged commit 5e471ac into hs-web:5.0.x Sep 23, 2026
2 checks passed
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.

2 participants