Repository navigation
test(interop): exercise real IETF control sessions #6306
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
20ff147
2e46866
b1fa5fe
f70b280
22a10cf
3af228f
cb690c6
5a8aef5
59b8dda
eeda9cc
713edd0
54830aa
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||
|---|---|---|---|---|---|---|---|---|
|
|
@@ -806,6 +806,7 @@ export class Producer { | |||||||
| hooks.producerLargest = (producer) => producer.#state.largest; | ||||||||
| hooks.joinProducer = (producer) => producer.#join(); | ||||||||
| hooks.endTrack = (producer, end) => producer.#endPending(end); | ||||||||
| hooks.releaseTrack = (producer) => producer.#close(undefined, false); | ||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift 🔎 Supported by static analysis
Fail an interrupted group during track release.
🐛 Suggested fix
📝 Committable suggestion
🤖 Prompt for AI Agents
Source: Coding guidelines |
||||||||
| hooks.startTrack = (producer, served) => { | ||||||||
| producer.#served = served; | ||||||||
| producer.#owe(); | ||||||||
|
|
@@ -1724,13 +1725,19 @@ export class Producer { | |||||||
| * them. | ||||||||
| */ | ||||||||
| close(abort?: Error) { | ||||||||
| this.#close(abort, true); | ||||||||
| } | ||||||||
|
|
||||||||
| // `declare` is false for a received copy whose session closed locally: a dead route, not | ||||||||
| // finished content, so a clean close there leaves the end undeclared. | ||||||||
| #close(abort: Error | undefined, declare: boolean) { | ||||||||
| if (this.#state.closed.peek() !== undefined) return; | ||||||||
| // A gap past the grace was lost before the abort rather than cut off by it. | ||||||||
| if (abort && this.#tailPending) this.#arrivals.expire(now(), this.#grace()); | ||||||||
| if (abort && this.#settled()) abort = undefined; | ||||||||
| // A replacement continues its name's timeline: ending below an earlier producer's | ||||||||
| // groups would contradict the ones subscribers already received. | ||||||||
| if (abort === undefined && this.#state.end.peek() === undefined) { | ||||||||
| if (declare && abort === undefined && this.#state.end.peek() === undefined) { | ||||||||
| this.#declareEnd({ group: this.#liveEdge(), frame: 0 }); | ||||||||
| } | ||||||||
| // Nobody will finish these, so a subscriber that has not taken one yet never sees it. | ||||||||
|
|
||||||||
This file was deleted.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When a locally closed session has already delivered part of an open group,
releaseTrackcalls#close(undefined, false). Although that correctly withholds the track end,#closethen passesundefinedto each cached and sink group, making the partial group close cleanly;Group.Consumer.readFrame()treats that as EOF and only attempts route recovery for anError. A GOAWAY during group transfer can therefore silently truncate the group instead of continuing it from the replacement route. Release open groups with a route-failure error while keeping the track end undeclared, matching the Rust received-copy close behavior.Useful? React with 👍 / 👎.