Skip to content

test: AstEvaluatorCalculatorTest が P4PreferredAstMapper.parseViaMapperCompat で CPU 張り付きハング — mvn verify が完走しない #19

Description

@opaopa6969

症状

mvn test(フルスイート)が CalculatorImplTest.compileOnlyAstEvaluatorCalculatorTest(preConstructedCalculator)で CPU 100% のまま 50 分以上停止 する。テストの失敗ではなくパースが終わらないため、CI の Full verify ジョブはこのままでは永久に通らない。

証拠 (2026-06-12 計測)

スレッドダンプ(53分経過時点、cpu=3,186秒 ≒ 経過時間と同じ = 完全 CPU バウンド):

"main" RUNNABLE cpu=3186391ms
  at org.unlaxer.StringSource.<init>(StringSource.java:109)
  at org.unlaxer.StringSource.peek(StringSource.java:290)
  at org.unlaxer.parser.elementary.WordParser.getToken(WordParser.java:77)
  ... (Choice/Chain の深いバックトラック) ...
  at org.unlaxer.tinyexpression.p4.P4PreferredAstMapper.parseViaMapperCompat(P4PreferredAstMapper.java:918)
  at org.unlaxer.tinyexpression.p4.P4PreferredAstMapper.parseByAstSimpleName(P4PreferredAstMapper.java:101)
  at org.unlaxer.tinyexpression.evaluator.ast.GeneratedAstRuntimeProbe.tryMapAstOnce(GeneratedAstRuntimeProbe.java:109)
  at org.unlaxer.tinyexpression.evaluator.ast.AstEvaluatorCalculator.validateFormulaParseable(AstEvaluatorCalculator.java:801)
  at org.unlaxer.tinyexpression.evaluator.ast.AstEvaluatorCalculator.<init>(AstEvaluatorCalculator.java:85)
  at org.unlaxer.tinyexpression.evaluator.ast.AstEvaluatorCalculatorTest.preConstructedCalculator(AstEvaluatorCalculatorTest.java:18)
  at org.unlaxer.tinyexpression.CalculatorImplTest.compileOnly(CalculatorImplTest.java:326)

切り分け結果

対処案

  1. 即効: surefire に <forkedProcessTimeoutInSeconds> またはテスト側 @Test(timeout=...) を設定し、ハング→明示的失敗に変える(CI が 6h 押し黙る事故の防止)
  2. 原因調査: parseViaMapperCompat に渡る式と grammar の組合せで指数的バックトラックが起きている。CalculatorImplTest.compileOnly が流す式を特定し最小再現を作る(handoff: tinyexpression × unlaxer 3.0.2 再スタート — 状態整理と次ステップ #12 の推奨手順どおり)
  3. unlaxer 側の改善余地: ホットパスが StringSource.peeknew StringSource(コードポイント配列の都度コピー)なのでメモ化/packrat があれば緩和される可能性。ただしまず文法側の左因子化で解決するか確認すべき

関連

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions