mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-04 05:18:25 +00:00 
			
		
		
		
	This PR fixes a panic issue in the WaitGroup that occurs when Gitea is shut down using Ctrl+C. It ensures that all active connection pointers in the server are properly tracked and forcibly closed when the hammer shutdown is invoked. The process remains graceful — the normal shutdown sequence runs before the hammer is triggered, and existing connections are given a timeout period to complete gracefully. This PR also fixes `no logger writer` problem. Now the log close will only be invoked when the command exit. - Fixes #35468 - Fixes #35551 - Fixes #35559 - Replace #35578 --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
		
			
				
	
	
		
			55 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2019 The Gitea Authors. All rights reserved.
 | 
						|
// SPDX-License-Identifier: MIT
 | 
						|
 | 
						|
package graceful
 | 
						|
 | 
						|
import (
 | 
						|
	"os"
 | 
						|
 | 
						|
	"code.gitea.io/gitea/modules/log"
 | 
						|
)
 | 
						|
 | 
						|
// awaitShutdown waits for the shutdown signal from the Manager
 | 
						|
func (srv *Server) awaitShutdown() {
 | 
						|
	select {
 | 
						|
	case <-GetManager().IsShutdown():
 | 
						|
		// Shutdown
 | 
						|
		srv.doShutdown()
 | 
						|
	case <-GetManager().IsHammer():
 | 
						|
		// Hammer
 | 
						|
		srv.doShutdown()
 | 
						|
		srv.doHammer()
 | 
						|
	}
 | 
						|
	<-GetManager().IsHammer()
 | 
						|
	srv.doHammer()
 | 
						|
}
 | 
						|
 | 
						|
// shutdown closes the listener so that no new connections are accepted
 | 
						|
// and starts a goroutine that will hammer (stop all running requests) the server
 | 
						|
// after setting.GracefulHammerTime.
 | 
						|
func (srv *Server) doShutdown() {
 | 
						|
	// only shutdown if we're running.
 | 
						|
	if srv.getState() != stateRunning {
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	srv.setState(stateShuttingDown)
 | 
						|
 | 
						|
	if srv.OnShutdown != nil {
 | 
						|
		srv.OnShutdown()
 | 
						|
	}
 | 
						|
	err := srv.listener.Close()
 | 
						|
	if err != nil {
 | 
						|
		log.Error("PID: %d Listener.Close() error: %v", os.Getpid(), err)
 | 
						|
	} else {
 | 
						|
		log.Info("PID: %d Listener (%s) closed.", os.Getpid(), srv.listener.Addr())
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (srv *Server) doHammer() {
 | 
						|
	if srv.getState() != stateShuttingDown {
 | 
						|
		return
 | 
						|
	}
 | 
						|
	srv.closeAllConnections()
 | 
						|
}
 |