From b695376086f2ee2319378f47836d6974c5ef1d39 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Mon, 4 Apr 2022 21:37:10 +0530 Subject: [PATCH] Avoid locking in callback (#588) --- pkg/rtc/mediatracksubscriptions.go | 8 +++++--- pkg/rtc/participant.go | 16 +++++++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/pkg/rtc/mediatracksubscriptions.go b/pkg/rtc/mediatracksubscriptions.go index f5393f99f..edcd1d15b 100644 --- a/pkg/rtc/mediatracksubscriptions.go +++ b/pkg/rtc/mediatracksubscriptions.go @@ -109,13 +109,13 @@ func (t *MediaTrackSubscriptions) AddSubscriber(sub types.LocalParticipant, code trackID := t.params.MediaTrack.ID() subscriberID := sub.ID() - t.subscribedTracksMu.Lock() - defer t.subscribedTracksMu.Unlock() - // don't subscribe to the same track multiple times + t.subscribedTracksMu.Lock() if _, ok := t.subscribedTracks[subscriberID]; ok { + t.subscribedTracksMu.Unlock() return nil, nil } + t.subscribedTracksMu.Unlock() var rtcpFeedback []webrtc.RTCPFeedback switch t.params.MediaTrack.Kind() { @@ -257,7 +257,9 @@ func (t *MediaTrackSubscriptions) AddSubscriber(sub types.LocalParticipant, code sub.Negotiate() }) + t.subscribedTracksMu.Lock() t.subscribedTracks[subscriberID] = subTrack + t.subscribedTracksMu.Unlock() subTrack.SetPublisherMuted(t.params.MediaTrack.IsMuted()) // since sub will lock, run it in a goroutine to avoid deadlocks diff --git a/pkg/rtc/participant.go b/pkg/rtc/participant.go index 41700b897..bec3c3607 100644 --- a/pkg/rtc/participant.go +++ b/pkg/rtc/participant.go @@ -1216,8 +1216,22 @@ func (p *ParticipantImpl) onSubscribedMaxQualityChange(trackID livekit.TrackID, SubscribedQualities: subscribedQualities, } - p.params.Telemetry.TrackMaxSubscribedVideoQuality(context.Background(), p.ID(), &livekit.TrackInfo{Sid: string(trackID), Type: livekit.TrackType_VIDEO}, maxSubscribedQuality) + p.params.Telemetry.TrackMaxSubscribedVideoQuality( + context.Background(), + p.ID(), + &livekit.TrackInfo{ + Sid: string(trackID), + Type: livekit.TrackType_VIDEO, + }, + maxSubscribedQuality, + ) + p.params.Logger.Debugw( + "sending max subscribed quality", + "trackID", trackID, + "qualities", subscribedQualities, + "max", maxSubscribedQuality, + ) return p.writeMessage(&livekit.SignalResponse{ Message: &livekit.SignalResponse_SubscribedQualityUpdate{ SubscribedQualityUpdate: subscribedQualityUpdate,