Skip to content

Commit 4cb24e3

Browse files
committed
Enhance method (*serveCtx) serve to wait for all goroutines to complete before it returns
Signed-off-by: Benjamin Wang <[email protected]>
1 parent ecd7cfc commit 4cb24e3

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

server/embed/serve.go

+19-5
Original file line numberDiff line numberDiff line change
@@ -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

7375
type 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

271283
func 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

Comments
 (0)