From 92833db6f3a47c7452101cbbaf4073f6fb011fa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Thu, 29 May 2025 15:09:45 +0800 Subject: [PATCH] =?UTF-8?q?graceful=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- graceful.go | 67 +++++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/graceful.go b/graceful.go index 32e1c82..1783a89 100644 --- a/graceful.go +++ b/graceful.go @@ -25,13 +25,13 @@ import ( ) const ( - PRE_SIGNAL = iota - POST_SIGNAL + PreSignal = iota + PostSignal - STATE_INIT - STATE_RUNNING - STATE_SHUTTING_DOWN - STATE_TERMINATE + StateInit + StateRunning + StateShuttingDown + StateTerminate ) var ( @@ -111,7 +111,7 @@ func NewServer(addr string, handler http.Handler) (srv *endlessServer) { sigChan: make(chan os.Signal), isChild: isChild, SignalHooks: map[int]map[os.Signal][]func(){ - PRE_SIGNAL: map[os.Signal][]func(){ + PreSignal: map[os.Signal][]func(){ syscall.SIGHUP: []func(){}, syscall.SIGUSR1: []func(){}, syscall.SIGUSR2: []func(){}, @@ -119,7 +119,7 @@ func NewServer(addr string, handler http.Handler) (srv *endlessServer) { syscall.SIGTERM: []func(){}, syscall.SIGTSTP: []func(){}, }, - POST_SIGNAL: map[os.Signal][]func(){ + PostSignal: map[os.Signal][]func(){ syscall.SIGHUP: []func(){}, syscall.SIGUSR1: []func(){}, syscall.SIGUSR2: []func(){}, @@ -128,7 +128,7 @@ func NewServer(addr string, handler http.Handler) (srv *endlessServer) { syscall.SIGTSTP: []func(){}, }, }, - state: STATE_INIT, + state: StateInit, lock: &sync.RWMutex{}, } @@ -196,11 +196,11 @@ down the server. */ func (srv *endlessServer) Serve() (err error) { defer log.Println(syscall.Getpid(), "Serve() returning...") - srv.setState(STATE_RUNNING) + srv.setState(StateRunning) err = srv.Server.Serve(srv.EndlessListener) log.Println(syscall.Getpid(), "Waiting for connections to finish...") srv.wg.Wait() - srv.setState(STATE_TERMINATE) + srv.setState(StateTerminate) return } @@ -318,10 +318,7 @@ func (srv *endlessServer) getListener(laddr string) (l net.Listener, err error) return } -/* -handleSignals listens for os Signals and calls any hooked in function that the -user had registered with the signal. -*/ +// handleSignals 监听系统传递的信号量, 并根据不同的信号量进行不同的逻辑处理 func (srv *endlessServer) handleSignals() { var sig os.Signal @@ -330,10 +327,13 @@ func (srv *endlessServer) handleSignals() { hookableSignals..., ) + // 获取当前进程ID pid := syscall.Getpid() for { + // 无缓冲chan, 阻塞等待信号量 sig = <-srv.sigChan - srv.signalHooks(PRE_SIGNAL, sig) + // 触发信号量处理之前的逻辑 + srv.signalHooks(PreSignal, sig) switch sig { case syscall.SIGHUP: log.Println(pid, "Received SIGHUP. forking.") @@ -357,7 +357,8 @@ func (srv *endlessServer) handleSignals() { default: log.Printf("Received %v: nothing i care about...\n", sig) } - srv.signalHooks(POST_SIGNAL, sig) + // 触发信号量处理之后的逻辑 + srv.signalHooks(PostSignal, sig) } } @@ -371,21 +372,24 @@ func (srv *endlessServer) signalHooks(ppFlag int, sig os.Signal) { return } -/* -shutdown closes the listener so that no new connections are accepted. it also -starts a goroutine that will hammer (stop all running requests) the server -after DefaultHammerTime. -*/ +// shutdown 关闭服务(平滑) +// +// 1. 关闭监听器, 不再接受新的连接 +// +// 2. 等待所有连接处理完毕后, 退出服务 +// +// 3. 如果设置了 DefaultHammerTime, 则在该时间后强制退出服务 func (srv *endlessServer) shutdown() { - if srv.getState() != STATE_RUNNING { + if srv.getState() != StateRunning { return } - srv.setState(STATE_SHUTTING_DOWN) + // 将服务状态设置为 StateShuttingDown(关闭中) + srv.setState(StateShuttingDown) if DefaultHammerTime >= 0 { go srv.hammerTime(DefaultHammerTime) } - // disable keep-alives on existing connections + // 已存在的连接禁用keep-alives srv.SetKeepAlivesEnabled(false) err := srv.EndlessListener.Close() if err != nil { @@ -413,13 +417,13 @@ func (srv *endlessServer) hammerTime(d time.Duration) { log.Println("WaitGroup at 0", r) } }() - if srv.getState() != STATE_SHUTTING_DOWN { + if srv.getState() != StateShuttingDown { return } time.Sleep(d) log.Println("[STOP - Hammer Time] Forcefully shutting down parent") for { - if srv.getState() == STATE_TERMINATE { + if srv.getState() == StateTerminate { break } srv.wg.Done() @@ -555,13 +559,10 @@ func (w endlessConn) Close() error { return err } -/* -RegisterSignalHook registers a function to be run PRE_SIGNAL or POST_SIGNAL for -a given signal. PRE or POST in this case means before or after the signal -related code endless itself runs -*/ +// RegisterSignalHook 注册各个信号前置/后置处理逻辑 +// PreSignal 和 PostSignal 分别表示信号前置和后置处理逻辑 func (srv *endlessServer) RegisterSignalHook(prePost int, sig os.Signal, f func()) (err error) { - if prePost != PRE_SIGNAL && prePost != POST_SIGNAL { + if prePost != PreSignal && prePost != PostSignal { err = fmt.Errorf("Cannot use %v for prePost arg. Must be endless.PRE_SIGNAL or endless.POST_SIGNAL.", sig) return }