mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 10:03:23 +09:00
[MG_Remote, CI] (P6): the split retrace lane becomes the whole CI matrix, both backends, both transports
It was one case on one backend under one transport: OpenRA, DirectGLES,
inproc. It is now every CI case, both backends, inproc AND spawn - 154 CI
entries, 156 local ctest entries - because every defect the spawn work turned
up was a question about the SERVER's process and not about any one trace or
either backend.
THE DirectVulkan ARM. tools/trace_replay/CMakeLists.txt carried "a
DirectVulkan arm would be measuring a server nobody has written yet". True
when P5 wrote it; false since P5f/P7 landed Magma's server consumers and its
run-ahead readiness gate. Leaving it would have shipped a split shape whose
second backend nothing ever ran - the same class of hole as a lane that runs
monolith under a name that says split. Magma now brings up a server process
of its own and OpenRA retraces across it at ssim=1.000000, which is only
possible because this branch also taught the child to load its config: before
that, a DirectVulkan session brought up a DirectGLES server and the two
halves disagreed about which backend the capability mask describes.
`split` BECOMES AN OPT-OUT. It began as an opt-in naming one case, because
one case was the work. Marking 39 cases `"split": true` would carry no
information and would reinstate the hole the key was written to close, only
mirrored: a case added later would get the monolith arms and be silently
absent from the split ones, and absent is the one state nothing reds on. A CI
case is now in the subset unless it says `"split": false`, which is a
reviewable claim that a trace cannot cross a role boundary.
THE CI MATRIX GAINS A THIRD DIMENSION. The job took {backend, case} and
hard-coded MOBILEGL_TRANSPORT=inproc in its own run block, so `spawn` had no
way into CI at all; the .SPAWN ctest entries existed only for a local build.
It is {backend, case, transport} now, the backends are the case's own
ci_backends rather than a hard-coded DirectGLES, and the artifact names carry
the transport or the two arms of one {backend, case} would overwrite each
other's uploads.
inproc STAYS AS THE CONTROL. Same library, same codec, same applier, same
picture; the only difference is which process the server role runs in.
Running only spawn would leave "did the transport break it?" and "did the
phase break it?" answerable only together - which is the question every
failure in this phase has turned on, including the SIGSEGV that D1 explained.
BOTH NEGATIVE CONTROLS FOLLOW THE ARM. retrace_pull_library_control.sh and
retrace_drop_draw_control.sh each exported MOBILEGL_TRANSPORT=inproc
themselves, so on a spawn job they would have gone on proving something about
the other arm while spawn ran unguarded. They read SPLIT_TRANSPORT now, and
default to inproc so a caller that sets nothing behaves exactly as before.
scripts/ci/control_smoke_test.sh: 22 passed, 0 failed against the stubbed
ctest, including the two modes that matter most - a red whose SSIM never fell
and a knob that armed and dropped nothing.
The spawn arm needs a second binary and the inproc arm needs none, so the job
places libMobileGLServer.so only on the spawn arm and a missing one is a
named failure there rather than a LaunchServer refusal 78 jobs deep.
Measured locally as this lands: 39 of the 78 SPAWN entries complete, all
green. The rest are still running.
This commit is contained in:
@@ -84,14 +84,21 @@ if [ "${matched}" -lt 1 ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# A PREVIOUS RUN'S LINE MUST NEVER ARM THIS ONE. The library opens its log fopen(path, "w"), so
|
||||
# the replay truncates it - but only if the replay gets that far, and a run that died in the
|
||||
# loader would leave the baseline's log in place with a perfectly good "control armed" line in
|
||||
# it. Removing it first is the same rule split_negative_controls.sh's `reset` step follows.
|
||||
# A PREVIOUS RUN'S LINE MUST NEVER ARM THIS ONE. The CLIENT truncates this log once at open and
|
||||
# then appends (P6 made the sink O_APPEND, because under spawn a second process writes the same
|
||||
# file and two truncating handles overwrite each other's bytes) - but it only truncates if the
|
||||
# replay gets that far, and a run that died in the loader would leave the baseline's log in place
|
||||
# with a perfectly good "control armed" line in it. Removing it first is the same rule
|
||||
# split_negative_controls.sh's `reset` step follows.
|
||||
rm -f "${LIBRARY_LOG}"
|
||||
|
||||
out="${CONTROL_TMPDIR}/retrace-drop-draw-output.txt"
|
||||
export MOBILEGL_TRANSPORT=inproc
|
||||
# THE TRANSPORT COMES FROM THE JOB, not from this file. retrace-split is a matrix over
|
||||
# {backend, case, transport} as of P6, and a control that hard-coded `inproc` would have gone on
|
||||
# proving something about the OTHER arm while the spawn arm ran unguarded. Default inproc so a
|
||||
# caller that sets nothing behaves exactly as before.
|
||||
transport="${SPLIT_TRANSPORT:-inproc}"
|
||||
export MOBILEGL_TRANSPORT="${transport}"
|
||||
export MOBILEGL_IPC_E2_DROP_DRAW=1
|
||||
"${CTEST}" -V --no-tests=error --timeout 10800 -R "${selector}" > "${out}" 2>&1
|
||||
control_rc=$?
|
||||
|
||||
@@ -105,7 +105,12 @@ if [ "${remote_count}" -ne 0 ]; then
|
||||
fi
|
||||
|
||||
out="${CONTROL_TMPDIR}/retrace-control-output.txt"
|
||||
export MOBILEGL_TRANSPORT=inproc
|
||||
# THE TRANSPORT COMES FROM THE JOB, not from this file. retrace-split is a matrix over
|
||||
# {backend, case, transport} as of P6, and a control that hard-coded `inproc` would have gone on
|
||||
# proving something about the OTHER arm while the spawn arm ran unguarded. Default inproc so a
|
||||
# caller that sets nothing behaves exactly as before.
|
||||
transport="${SPLIT_TRANSPORT:-inproc}"
|
||||
export MOBILEGL_TRANSPORT="${transport}"
|
||||
"${CTEST}" -V --no-tests=error --timeout 10800 -R "${selector}" > "${out}" 2>&1
|
||||
control_rc=$?
|
||||
cat "${out}"
|
||||
|
||||
Reference in New Issue
Block a user