From eecddbb65a0c7d845d6488487b77c7e5524e9dfc Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Mon, 31 Jul 2023 11:43:47 +0530 Subject: [PATCH] Issue full reconnect if subscriber PC is closed on ICERestart (#1919) Server could have closed subscriber PC to aid migration. But, if a resumes lands back on that node, a resume of the participant session is not possible as subscriber PC is already closed. While theoretically possible to form a new subscriber peer conenction, reducing complexity and issuing a full reconnect as this should be a rare case. --- pkg/rtc/participant.go | 4 +++- pkg/rtc/transport.go | 23 +++++++++++++++-------- pkg/rtc/transportmanager.go | 4 ++-- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/pkg/rtc/participant.go b/pkg/rtc/participant.go index aea4c9e94..cd0d61e9d 100644 --- a/pkg/rtc/participant.go +++ b/pkg/rtc/participant.go @@ -863,7 +863,9 @@ func (p *ParticipantImpl) ICERestart(iceConfig *livekit.ICEConfig) { t.(types.LocalMediaTrack).Restart() } - p.TransportManager.ICERestart(iceConfig) + if err := p.TransportManager.ICERestart(iceConfig); err != nil { + p.IssueFullReconnect(types.ParticipantCloseReasonNegotiateFailed) + } } func (p *ParticipantImpl) OnICEConfigChanged(f func(participant types.LocalParticipant, iceConfig *livekit.ICEConfig)) { diff --git a/pkg/rtc/transport.go b/pkg/rtc/transport.go index 0eaabd1ed..2c565f194 100644 --- a/pkg/rtc/transport.go +++ b/pkg/rtc/transport.go @@ -72,13 +72,14 @@ const ( ) var ( - ErrIceRestartWithoutLocalSDP = errors.New("ICE restart without local SDP settled") - ErrNoTransceiver = errors.New("no transceiver") - ErrNoSender = errors.New("no sender") - ErrNoICECandidateHandler = errors.New("no ICE candidate handler") - ErrNoOfferHandler = errors.New("no offer handler") - ErrNoAnswerHandler = errors.New("no answer handler") - ErrMidNotFound = errors.New("mid not found") + ErrIceRestartWithoutLocalSDP = errors.New("ICE restart without local SDP settled") + ErrIceRestartOnClosedPeerConnection = errors.New("ICE restart on closed peer connection") + ErrNoTransceiver = errors.New("no transceiver") + ErrNoSender = errors.New("no sender") + ErrNoICECandidateHandler = errors.New("no ICE candidate handler") + ErrNoOfferHandler = errors.New("no offer handler") + ErrNoAnswerHandler = errors.New("no answer handler") + ErrMidNotFound = errors.New("mid not found") ) // ------------------------------------------------------------------------- @@ -1103,10 +1104,16 @@ func (t *PCTransport) Negotiate(force bool) { } } -func (t *PCTransport) ICERestart() { +func (t *PCTransport) ICERestart() error { + if t.pc.ConnectionState() == webrtc.PeerConnectionStateClosed { + t.params.Logger.Warnw("trying to restart ICE on closed peer connection", nil) + return ErrIceRestartOnClosedPeerConnection + } + t.postEvent(event{ signal: signalICERestart, }) + return nil } func (t *PCTransport) ResetShortConnOnICERestart() { diff --git a/pkg/rtc/transportmanager.go b/pkg/rtc/transportmanager.go index 3f698ebe1..1b056b6e4 100644 --- a/pkg/rtc/transportmanager.go +++ b/pkg/rtc/transportmanager.go @@ -521,12 +521,12 @@ func (t *TransportManager) HandleClientReconnect(reason livekit.ReconnectReason) } } -func (t *TransportManager) ICERestart(iceConfig *livekit.ICEConfig) { +func (t *TransportManager) ICERestart(iceConfig *livekit.ICEConfig) error { if iceConfig != nil { t.SetICEConfig(iceConfig) } - t.subscriber.ICERestart() + return t.subscriber.ICERestart() } func (t *TransportManager) OnICEConfigChanged(f func(iceConfig *livekit.ICEConfig)) {