From 5535916ff27d985430cf95acae1f4007c3676d1e Mon Sep 17 00:00:00 2001 From: Paul Wells Date: Sun, 16 Jul 2023 19:01:53 -0700 Subject: [PATCH] prevent signal context from closing before room setup finishes (#1885) --- pkg/service/signal.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pkg/service/signal.go b/pkg/service/signal.go index 2c28465d8..299df055a 100644 --- a/pkg/service/signal.go +++ b/pkg/service/signal.go @@ -138,6 +138,12 @@ func (r *signalService) RelaySignal(stream psrpc.ServerStream[*rpc.RelaySignalRe // copy the incoming rpc headers to avoid dropping any session vars. ctx, cancel := context.WithCancel(metadata.NewContextWithIncomingHeader(context.Background(), metadata.IncomingHeader(stream.Context()))) + // wait until room setup finishes to cancel the session context even if the + // stream has closed. this is required to complete setup i/o after room api + // has discarded the temp client. + sessionHandlerDone := make(chan struct{}) + defer close(sessionHandlerDone) + sink := routing.NewSignalMessageSink(routing.SignalSinkParams[*rpc.RelaySignalResponse, *rpc.RelaySignalRequest]{ Logger: l, Stream: stream, @@ -157,13 +163,14 @@ func (r *signalService) RelaySignal(stream psrpc.ServerStream[*rpc.RelaySignalRe l.Infow("signal stream closed", "error", err) reqChan.Close() + + <-sessionHandlerDone cancel() }() err = r.sessionHandler(ctx, livekit.RoomName(ss.RoomName), *pi, livekit.ConnectionID(ss.ConnectionId), reqChan, sink) if err != nil { l.Errorw("could not handle new participant", err) - cancel() return }