From 7ae1c11de01b41dca08dab5fcaa9d59c727fc635 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Tue, 22 Sep 2026 20:43:05 -0400 Subject: [PATCH] [tools] (P7): a spawn retrace with no server log is a fatal, not a clean census Fable review of the B3 rework, should-fix: run_trace_case.cmake read the server log only `if(EXISTS ...)`. Under spawn the server process writes its own file, and the lines the runner counts out of it - the applier Fatal{ lines and the MGWIRE-FLOOR unsound-serial-complete line, which only the server's VulkanRenderer::OnSubmitsCompletedUpTo emits - are nowhere else, so a server that died before its first line read as "0 lines" and went green. The client log was already fail-closed, and so was the tcp arm's forwarded server log; plain spawn was not. The plain-spawn branch of the transport block now FATALs when mobilegl.server.log does not exist, beside the tcp arm's identical check. Demonstration: the SPAWN ctest command line with TRACE_REPLAY_EXE replaced by a wrapper that runs the real replay and then deletes output/mobilegl.server.log (541 lines): runner at aab01275 -> rc 0, "Fatal{ lines across ... : 0", "MGWIRE-FLOOR unsound-serial-complete lines: 0" (green, half unseen) this runner -> rc 1: CMake Error at run_trace_case.cmake:321 (message): OpenRA DirectVulkan: MOBILEGL_TRANSPORT=spawn but the run wrote no .../output/mobilegl.server.log, so the server role's Fatal{ and MGWIRE-FLOOR lines cannot be counted. A spawn retrace with no server log cannot be counted as a clean one. MobileGLTraceReplay.OpenRA.DirectVulkan.SPLIT / .SPAWN unmodified: both pass, ssim 1.000000, 0 px, 0 MGWIRE-FLOOR lines. --- tools/trace_replay/run_trace_case.cmake | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tools/trace_replay/run_trace_case.cmake b/tools/trace_replay/run_trace_case.cmake index 571f6f74..92e5a5de 100644 --- a/tools/trace_replay/run_trace_case.cmake +++ b/tools/trace_replay/run_trace_case.cmake @@ -311,6 +311,19 @@ if(DEFINED ENV{MOBILEGL_TRANSPORT} AND NOT "$ENV{MOBILEGL_TRANSPORT}" STREQUAL " endif() else() set(split_expected_second "spawn ARMED - the server role runs in pid ") + # FAIL-CLOSED LIKE THE CLIENT LOG ABOVE AND THE TCP ARM'S SERVER LOG. Under spawn + # the server process writes its own file, and the lines this runner counts out of + # it - every applier Fatal{, and the MGWIRE-FLOOR line, which only the server's + # VulkanRenderer::OnSubmitsCompletedUpTo emits - exist nowhere else. A server that + # died before its first line leaves no file, and "no file" read as "0 lines" is a + # green census of the half of the session that was never seen. + if(NOT EXISTS "${mobilegl_server_log}") + message(FATAL_ERROR + "${split_case}: MOBILEGL_TRANSPORT=spawn but the run wrote no " + "${mobilegl_server_log}, so the server role's Fatal{ and MGWIRE-FLOOR " + "lines cannot be counted. A spawn retrace with no server log cannot be " + "counted as a clean one.") + endif() endif() else() message(FATAL_ERROR