Class ReactorRolloutDifferTest

java.lang.Object
scripting.ReactorRolloutDifferTest

public class ReactorRolloutDifferTest extends Object
Track B(Nashorn → GraalJS)— C4 rollout②:reactor 類別黃金參考 differ。

對應計畫 C4 的出口條件「Tier2+Tier3 differ 過關」。reactor 與 portal 不同之處:

  • 進入點:reactor 線上以 engine.put("rm", ..) + invokeFunction("act") 呼叫 (無引數,經全域 rm),而非 portal 的 getInterface(PortalScript).enter(ppi) SAM。 故本檔的轉錄 differ 走 invokeFunction("act"),綁定 parity 以 typeof act === "function" 逐檔比對(線上實際呼叫路徑)。
  • 快取/執行緒模型:reactor 引擎為 per-client 快取(AbstractScriptManager,非 portal 的 行程級單例),但 ReactorScriptManager.act() 會被 Netty worker(HitReactor/TouchReactor) 與 MapTimer(ActivateItemReactor/delayedHitReactor)兩執行緒族挾「同一 client」並發呼叫 → 同一 (client, reactorId) 的引擎共用一條 GraalJS Context、禁並發 → 需 per-(client,reactorId) 序列化 (見 ReactorScriptManager.act(MapleClient, MapleReactor)MapleClient.getReactorScriptLock(int))。本檔下半的 並發回歸組在引擎層重現危害並佐證該鎖。

同一 JVM 並存 nashorn-core(黃金參考)與 GraalJS(候選),由 ScriptEngines.fresh(ScriptEngines.Backend) 建立。不需 DB / wz / 網路 / Timer。

  • Constructor Details

    • ReactorRolloutDifferTest

      public ReactorRolloutDifferTest()
  • Method Details

    • corpusParseAndActBindingAreEngineEquivalent

      public void corpusParseAndActBindingAreEngineEquivalent() throws Exception
      scripts/reactor/*.js 在 nashorn-core 與 GraalJS 必須等價(非「全部成功」):
      • 解析分歧(XOR)= 零:不得有任何腳本「一引擎解析成功、另一引擎失敗」。E4X/Nashorn-only 語法殘留會在此現形 —— rollout 硬門檻。(語料偵察 workflow 已掃全 272 檔:零 E4X、零 Java.type/ importClass、唯一 interop 為 new java.awt.Point 屬兩引擎 parity。)
      • act 綁定逐檔等價:eval(容忍頂層丟)後 typeof act === "function" 兩引擎須一致 —— 驗 ReactorScriptManager.act(MapleClient, MapleReactor) 線上實際走的 invokeFunction("act") 路徑。

      「兩引擎皆解析失敗」≠ 分歧(記錄到 build/reactor-parse-broken-both.txt,不擋 rollout)。

      Throws:
      Exception
    • tier2TranscriptsMatchAcrossEngines

      public void tier2TranscriptsMatchAcrossEngines() throws Exception
      Throws:
      Exception
    • sharedGraalReactorContextIsUnsafeUnderConcurrentActEntry

      public void sharedGraalReactorContextIsUnsafeUnderConcurrentActEntry() throws Exception
      重現危害:單一共用 GraalJS Context 被兩執行緒同時 invokeFunction("act")(線上 act 路徑) → 拋多執行緒例外(或一度重疊)。證明 flip 的並發危害真實存在、且單執行緒 differ 看不到。
      Throws:
      Exception
    • perScriptNameLockSerializesConcurrentReactorEntry

      public void perScriptNameLockSerializesConcurrentReactorEntry() throws Exception
      佐證修補:套上 per-(client,rid) ReentrantLock(即 ReactorScriptManager.act 對 GraalJS 路徑的 作法)→ 無例外、maxInFlight<=1
      Throws:
      Exception