Repository navigation
#725 Accept a respawned core's roster instead of keeping the dead core's - #727
Merged
Merged
Conversation
A core the supervisor respawns starts its roster epoch again at the same process and meeting numbers as the one that died; only the diagnostic token differs. ZoomRosterSnapshotPolicy could not order it after the installed barrier, so the bridge kept the dead core's roster for the rest of the app session. A Take applies its own raw sync response, which had the true roster, and the next bridge snapshot restored the stale one. That alternation was the multiview reflow on every cut. - MediaCoreBridgeService drops the roster barrier at the respawned core's handshake, keyed on the supervisor restart count. Participants are kept until the rejoin replaces them. - roster-drop log line: names the apply path and both roster epochs whenever someone leaves the shell's roster. - mv-roster-miss no longer fires for the empty pre-join roster. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Root cause and fix for #725 (multiview second row reflowing on every Take). #726 was the mitigation; this removes the cause.
Root cause
After the supervisor respawns the media core, the shell keeps the dead core's Zoom roster for the rest of the app session.
process:meeting:token. A new core process starts again at1:1; only the diagnostic token differs.ZoomRosterSnapshotPolicy.Acceptorders epochs by(process, meeting), so the new core's roster is never "newer" and is rejected.StopCoredoes. The supervisor's crash-respawn path did not.Evidence
media-core.logshows the core rejoining the meeting at 07:25:29, 07:27:11 and 07:27:43. The 42mv-roster-misslines start at 07:31:26 and line up one-to-one with[take]lines.corevideo-native.exe, wait for the respawn, Take. Every Take logged a drop:roster-drop: pid=16795648 origin=meeting-fields prevN=9 newN=8 ... snap(epoch=1:1:18772-0 rev=38 n=8) bridge(epoch=1:1:18772-0 rev=38 n=8)while/snapshot(the core's own JSON) readepoch=1:1:23540-0 rev=11 n=9.roster-sync), and 12 Takes log zero dips. The oneroster-dropin that run was a real leave: the killed engine's old participant timing out of the meeting, same epoch on both sides.Change
MediaCoreBridgeService.ReleaseRosterBarrierForRespawnedCore: at the respawned core's handshake, clear the roster epoch and revision and reset roster recovery. Keyed on the supervisor restart count, so an ordinary handshake does nothing. Participants are kept until the rejoin replaces them, so slots are not freed during the gap.roster-droplog line: whenever a participant leaves the shell's roster, name the apply path and the roster epoch it read next to the bridge's. Two epochs is this defect; one is a real leave.mv-roster-miss: no longer fires for the empty pre-join roster (ten false "dropped" lines on every launch).CLAUDE.mdMultiview second row reflows on Take: an in-show camera-off participant briefly drops from the shell roster #725 entry rewritten with the cause.Tests
RosterAfterCoreRespawnTests: a fake core that dies on command and comes back on a same-numbered epoch at a lower revision. Fails without the fix (Expected "1:1:core-b",Actual "1:1:core-a").MultiviewParticipantGraceTests.AnEmptyRosterBeforeAMeetingLogsNothing.Not covered
🤖 Generated with Claude Code