diff --git a/server/server.go b/server/server.go index ba915c64f23cb..42031fce9ffa1 100644 --- a/server/server.go +++ b/server/server.go @@ -790,6 +790,17 @@ func killConn(conn *clientConn) { } } +// KillSysProcesses kill sys processes such as auto analyze. +func (s *Server) KillSysProcesses() { + if s.dom == nil { + return + } + sysProcTracker := s.dom.SysProcTracker() + for connID := range sysProcTracker.GetSysProcessList() { + sysProcTracker.KillSysProcess(connID) + } +} + // KillAllConnections kills all connections when server is not gracefully shutdown. func (s *Server) KillAllConnections() { logutil.BgLogger().Info("[server] kill all connections.") @@ -804,12 +815,7 @@ func (s *Server) KillAllConnections() { killConn(conn) } - if s.dom != nil { - sysProcTracker := s.dom.SysProcTracker() - for connID := range sysProcTracker.GetSysProcessList() { - sysProcTracker.KillSysProcess(connID) - } - } + s.KillSysProcesses() } var gracefulCloseConnectionsTimeout = 15 * time.Second diff --git a/tidb-server/main.go b/tidb-server/main.go index 97ad1917105ca..05e16e67db8be 100644 --- a/tidb-server/main.go +++ b/tidb-server/main.go @@ -828,6 +828,9 @@ func cleanup(svr *server.Server, storage kv.Storage, dom *domain.Domain, gracefu if graceful { done := make(chan struct{}) svr.GracefulDown(context.Background(), done) + // Kill sys processes such as auto analyze. Otherwise, tidb-server cannot exit until auto analyze is finished. + // See https://github.com/pingcap/tidb/issues/40038 for details. + svr.KillSysProcesses() } else { svr.TryGracefulDown() }