@@ -68,6 +68,8 @@ type serveCtx struct {
6868 serviceRegister func (* grpc.Server )
6969 serversC chan * servers
7070 closeOnce sync.Once
71+
72+ wg sync.WaitGroup
7173}
7274
7375type servers struct {
@@ -182,13 +184,17 @@ func (sctx *serveCtx) serve(
182184 server = m .Serve
183185
184186 httpl := m .Match (cmux .HTTP1 ())
187+ sctx .wg .Add (1 )
185188 go func (srvhttp * http.Server , tlsLis net.Listener ) {
189+ defer sctx .wg .Done ()
186190 errHandler (srvhttp .Serve (tlsLis ))
187191 }(srv , httpl )
188192
189193 if grpcEnabled {
190194 grpcl := m .Match (cmux .HTTP2 ())
195+ sctx .wg .Add (1 )
191196 go func (gs * grpc.Server , l net.Listener ) {
197+ defer sctx .wg .Done ()
192198 errHandler (gs .Serve (l ))
193199 }(gs , grpcl )
194200 }
@@ -237,7 +243,7 @@ func (sctx *serveCtx) serve(
237243 TLSConfig : tlscfg ,
238244 ErrorLog : logger , // do not log user error
239245 }
240- if err : = configureHTTPServer (srv , s .Cfg ); err != nil {
246+ if err = configureHTTPServer (srv , s .Cfg ); err != nil {
241247 sctx .lg .Error ("Configure https server failed" , zap .Error (err ))
242248 return err
243249 }
@@ -248,11 +254,13 @@ func (sctx *serveCtx) serve(
248254 } else {
249255 server = m .Serve
250256
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
254260 }
261+ sctx .wg .Add (1 )
255262 go func (srvhttp * http.Server , tlsl net.Listener ) {
263+ defer sctx .wg .Done ()
256264 errHandler (srvhttp .Serve (tlsl ))
257265 }(srv , tlsl )
258266 }
@@ -265,7 +273,11 @@ func (sctx *serveCtx) serve(
265273 )
266274 }
267275
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
269281}
270282
271283func configureHTTPServer (srv * http.Server , cfg config.ServerConfig ) error {
@@ -334,7 +346,9 @@ func (sctx *serveCtx) registerGateway(dial func(ctx context.Context) (*grpc.Clie
334346 return nil , err
335347 }
336348 }
349+ sctx .wg .Add (1 )
337350 go func () {
351+ defer sctx .wg .Done ()
338352 <- ctx .Done ()
339353 if cerr := conn .Close (); cerr != nil {
340354 sctx .lg .Warn (
0 commit comments