@@ -68,6 +68,8 @@ type serveCtx struct {
68
68
serviceRegister func (* grpc.Server )
69
69
serversC chan * servers
70
70
closeOnce sync.Once
71
+
72
+ wg sync.WaitGroup
71
73
}
72
74
73
75
type servers struct {
@@ -182,13 +184,17 @@ func (sctx *serveCtx) serve(
182
184
server = m .Serve
183
185
184
186
httpl := m .Match (cmux .HTTP1 ())
187
+ sctx .wg .Add (1 )
185
188
go func (srvhttp * http.Server , tlsLis net.Listener ) {
189
+ defer sctx .wg .Done ()
186
190
errHandler (srvhttp .Serve (tlsLis ))
187
191
}(srv , httpl )
188
192
189
193
if grpcEnabled {
190
194
grpcl := m .Match (cmux .HTTP2 ())
195
+ sctx .wg .Add (1 )
191
196
go func (gs * grpc.Server , l net.Listener ) {
197
+ defer sctx .wg .Done ()
192
198
errHandler (gs .Serve (l ))
193
199
}(gs , grpcl )
194
200
}
@@ -237,7 +243,7 @@ func (sctx *serveCtx) serve(
237
243
TLSConfig : tlscfg ,
238
244
ErrorLog : logger , // do not log user error
239
245
}
240
- if err : = configureHTTPServer (srv , s .Cfg ); err != nil {
246
+ if err = configureHTTPServer (srv , s .Cfg ); err != nil {
241
247
sctx .lg .Error ("Configure https server failed" , zap .Error (err ))
242
248
return err
243
249
}
@@ -248,11 +254,13 @@ func (sctx *serveCtx) serve(
248
254
} else {
249
255
server = m .Serve
250
256
251
- tlsl , err := transport .NewTLSListener (m .Match (cmux .Any ()), tlsinfo )
252
- if err != nil {
253
- return err
257
+ tlsl , tlsErr := transport .NewTLSListener (m .Match (cmux .Any ()), tlsinfo )
258
+ if tlsErr != nil {
259
+ return tlsErr
254
260
}
261
+ sctx .wg .Add (1 )
255
262
go func (srvhttp * http.Server , tlsl net.Listener ) {
263
+ defer sctx .wg .Done ()
256
264
errHandler (srvhttp .Serve (tlsl ))
257
265
}(srv , tlsl )
258
266
}
@@ -265,7 +273,11 @@ func (sctx *serveCtx) serve(
265
273
)
266
274
}
267
275
268
- return server ()
276
+ err = server ()
277
+ sctx .close ()
278
+ // ensure all goroutines, which are created by this method, to complete before this method returns.
279
+ sctx .wg .Wait ()
280
+ return err
269
281
}
270
282
271
283
func configureHTTPServer (srv * http.Server , cfg config.ServerConfig ) error {
@@ -334,7 +346,9 @@ func (sctx *serveCtx) registerGateway(dial func(ctx context.Context) (*grpc.Clie
334
346
return nil , err
335
347
}
336
348
}
349
+ sctx .wg .Add (1 )
337
350
go func () {
351
+ defer sctx .wg .Done ()
338
352
<- ctx .Done ()
339
353
if cerr := conn .Close (); cerr != nil {
340
354
sctx .lg .Warn (
0 commit comments