Remove subscriber if track closed while adding subscriber. (#2537)

* Remove subscriber if track closed while adding subscriber.

It is possible that the track is closed when subscriber add is
processed. That subscriber would have been dangling off a closed track.

Check again after adding subscriber if track is closed.
If it is, remove the subscriber and return error so that subscription
manager re-resolves.

* oops, wrong unlock
This commit is contained in:
Raja Subramanian
2024-03-02 23:12:20 +05:30
committed by GitHub
parent 9a6d25674d
commit dbe2af3886
+21 -1
View File
@@ -102,6 +102,7 @@ type MediaTrackReceiver struct {
trackInfo *livekit.TrackInfo
potentialCodecs []webrtc.RTPCodecParameters
state mediaTrackReceiverState
willBeResumed bool
onSetupReceiver func(mime string)
onMediaLossFeedback func(dt *sfu.DownTrack, report *rtcp.ReceiverReport)
@@ -275,6 +276,8 @@ func (t *MediaTrackReceiver) ClearAllReceivers(willBeResumed bool) {
t.lock.Lock()
receivers := t.receivers
t.receivers = nil
t.willBeResumed = willBeResumed
t.lock.Unlock()
for _, r := range receivers {
@@ -482,7 +485,24 @@ func (t *MediaTrackReceiver) AddSubscriber(sub types.LocalParticipant) (types.Su
Logger: tLogger,
DisableRed: t.trackInfo.GetDisableRed() || !t.params.AudioConfig.ActiveREDEncoding,
})
return t.MediaTrackSubscriptions.AddSubscriber(sub, wr)
subTrack, err := t.MediaTrackSubscriptions.AddSubscriber(sub, wr)
// media track could have been closed while adding subscription
remove := false
willBeResumed := false
t.lock.RLock()
if t.state != mediaTrackReceiverStateOpen {
willBeResumed = t.willBeResumed
remove = true
}
t.lock.RUnlock()
if remove {
_ = t.MediaTrackSubscriptions.RemoveSubscriber(sub.ID(), willBeResumed)
return nil, ErrNotOpen
}
return subTrack, err
}
// RemoveSubscriber removes participant from subscription