-
Notifications
You must be signed in to change notification settings - Fork 219
Close peer connections before awaiting signal teardown #1335
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
Open
sebitokazu
wants to merge
1
commit into
livekit:main
Choose a base branch
from
sebitokazu:fix/close-peer-connections-before-signal-teardown
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+69
−4
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
12 changes: 12 additions & 0 deletions
12
.changeset/close_peer_connections_before_signal_teardown.md
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| --- | ||
| livekit: patch | ||
| livekit-ffi: patch | ||
| --- | ||
|
|
||
| # Close peer connections before awaiting signal teardown | ||
|
|
||
| `SessionInner::close` released the peer connections only after two awaits that can block | ||
| indefinitely, so cancelling `close()` — for example by wrapping it in a timeout — left the | ||
| transports open and their ICE UDP sockets bound for the lifetime of the process. Long-lived | ||
| clients eventually exhausted their file descriptors. The transports are now closed before | ||
| the first await, which makes the teardown safe to cancel. |
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
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
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
Oops, something went wrong.
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.
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.
🔴 Cancelling a room shutdown still leaves the media connections open
The media transports are still shut down (
self.publisher_pc.close()atlivekit/src/rtc_engine/rtc_session.rs:1995) only after the shutdown has already waited on four background workers, so abandoning a shutdown early still leaves them open.Impact: A caller who bounds room teardown with a short timeout still leaks the room's network sockets for the lifetime of the process, and the new test that asserts otherwise fails.
Why the reorder does not reach the first suspension point
Room::close→RoomSession::close(livekit/src/room/mod.rs:1175-1183) →RtcEngine::close→EngineInner::close(livekit/src/rtc_engine/mod.rs:1052-1065) →RtcSession::close(livekit/src/rtc_engine/rtc_session.rs:797-811).RtcSession::closeawaitshandle.rtc_task,handle.signal_task,handle.dc_taskandhandle.dt_sender_taskbefore callingself.inner.close(reason).await, which is where the newpublisher_pc.close()lives. ThoseJoinHandleawaits returnPendingon the first poll (the tasks have only just been signalled viaclose_tx, and on the default current-thread test runtime they cannot even run while the close future is being polled), and the workers themselves contain unbounded awaits.Consequently the future's first suspension happens at
handle.rtc_task.await, still with both peer connections open.livekit/tests/room_test.rs:114-122cancels at exactly that first suspension (timeout(Duration::ZERO, room.close())) and then assertsPeerConnectionState::Closed, which cannot hold under this call chain.To make cancellation actually safe, the transport close needs to happen before the task joins in
RtcSession::close(or at the very top of the teardown chain), not merely before the signal-client awaits inSessionInner::close.Prompt for agents
Was this helpful? React with 👍 or 👎 to provide feedback.