@@ -161,8 +161,11 @@ func Handler(ctx context.Context, store stores.Store, cloudflare *cloudflare.Cre
161161 util .ErrorAndDisconnect (ctx , conn , err )
162162 }
163163
164+ // Use a local variable for the request-scoped context to avoid
165+ // a data race with the ping goroutine that also reads ctx.
166+ reqCtx := ctx
164167 if base .RequestID != "" {
165- ctx = util .WithRequestID (ctx , base .RequestID )
168+ reqCtx = util .WithRequestID (reqCtx , base .RequestID )
166169 }
167170
168171 if peer .closedPacketReceived {
@@ -174,24 +177,24 @@ func Handler(ctx context.Context, store stores.Store, cloudflare *cloudflare.Cre
174177
175178 switch base .Type {
176179 case "credentials" :
177- credentials , err := cloudflare .GetCredentials (ctx )
180+ credentials , err := cloudflare .GetCredentials (reqCtx )
178181 if err != nil {
179- util .ReplyError (ctx , conn , err )
182+ util .ReplyError (reqCtx , conn , err )
180183 } else {
181184 packet := CredentialsPacket {
182185 Type : "credentials" ,
183186 Credentials : * credentials ,
184187 RequestID : base .RequestID ,
185188 }
186- if err := peer .Send (ctx , packet ); err != nil {
187- util .ErrorAndDisconnect (ctx , conn , err )
189+ if err := peer .Send (reqCtx , packet ); err != nil {
190+ util .ErrorAndDisconnect (reqCtx , conn , err )
188191 }
189192 }
190193
191194 case "event" :
192195 params := metrics.EventParams {}
193196 if err := json .Unmarshal (raw , & params ); err != nil {
194- util .ErrorAndDisconnect (ctx , conn , err )
197+ util .ErrorAndDisconnect (reqCtx , conn , err )
195198 }
196199
197200 // Add country and region to event data of the avg-latency-at-10s event.
@@ -207,17 +210,17 @@ func Handler(ctx context.Context, store stores.Store, cloudflare *cloudflare.Cre
207210 }
208211 }
209212
210- go metrics .RecordEvent (ctx , params )
213+ go metrics .RecordEvent (reqCtx , params )
211214
212215 case "ping" , "pong" :
213216 // ignore, ping/pong is just for the tcp keepalive.
214217
215218 default :
216- if err := peer .HandlePacket (ctx , base .Type , raw ); err != nil {
219+ if err := peer .HandlePacket (reqCtx , base .Type , raw ); err != nil {
217220 if err == ErrUnknownPacketType {
218221 logger .Warn ("unknown packet type received" , zap .String ("type" , base .Type ), zap .String ("peer" , peer .ID ), zap .String ("game" , peer .Game ), zap .String ("origin" , r .Header .Get ("Origin" )))
219222 } else {
220- util .ErrorAndDisconnect (ctx , conn , err )
223+ util .ErrorAndDisconnect (reqCtx , conn , err )
221224 }
222225 }
223226 }
0 commit comments