in runtime/gateway.go [403:490]
func (gateway *Gateway) Shutdown() {
// stop accepting incoming requests as soon as shutdown signal is received.
gateway.isUnhealthy = true
var swg sync.WaitGroup
ctx, cancel := context.WithTimeout(context.Background(), gateway.ShutdownTimeout())
defer cancel()
ec := make(chan error, 4)
if gateway.localHTTPServer != gateway.httpServer {
swg.Add(1)
go func() {
defer swg.Done()
if err := gateway.localHTTPServer.Shutdown(ctx); err != nil {
ec <- errors.Wrap(err, "error shutting down local http server")
}
}()
}
// shutdown http server
swg.Add(1)
go func() {
defer swg.Done()
if err := gateway.httpServer.Shutdown(ctx); err != nil {
ec <- errors.Wrap(err, "error shutting down http server")
}
}()
// shutdown tchannel server
swg.Add(1)
go func() {
defer swg.Done()
if err := gateway.shutdownTChannelServerAndClients(ctx); err != nil {
ec <- errors.Wrap(err, "error shutting down tchannel server or clients")
}
}()
// wait for servers to shutdown before stopping GRPCClientDispatcher
swg.Wait()
// stop all grpc clients
if gateway.GRPCClientDispatcher != nil {
swg.Add(1)
go func() {
defer swg.Done()
if err := gateway.GRPCClientDispatcher.Stop(); err != nil {
ec <- errors.Wrap(err, "error stopping gRPC client dispatcher")
}
}()
}
swg.Wait()
select {
case err := <-ec:
// close ec so that the range ec will not block forever
close(ec)
errs := make([]string, 0, cap(ec))
errs = append(errs, err.Error())
for e := range ec {
errs = append(errs, e.Error())
}
gateway.Logger.Error(fmt.Sprintf(
"%d errors when shutting down the servers: %s",
len(errs), strings.Join(errs, ";")),
)
gateway.RootScope.Counter("shutdown.failure").Inc(1)
default:
gateway.Logger.Info("servers are shut down gracefully")
gateway.RootScope.Counter("shutdown.success").Inc(1)
}
_ = gateway.tracerCloser.Close()
gateway.metricsBackend.Flush()
_ = gateway.scopeCloser.Close()
// close log files as the last step
if gateway.loggerFile != nil {
_ = gateway.loggerFile.Sync()
_ = gateway.loggerFile.Close()
}
// stop collecting runtime metrics
if gateway.runtimeMetrics != nil {
gateway.runtimeMetrics.Stop()
}
}