server exit gracefully a bit

This commit is contained in:
tuzhiwei
2023-01-19 21:40:36 +08:00
committed by finley
parent df672d4c92
commit 20f6307dca

View File

@@ -7,14 +7,15 @@ package tcp
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/hdt3213/godis/interface/tcp"
"github.com/hdt3213/godis/lib/logger"
"net" "net"
"os" "os"
"os/signal" "os/signal"
"sync" "sync"
"syscall" "syscall"
"time" "time"
"github.com/hdt3213/godis/interface/tcp"
"github.com/hdt3213/godis/lib/logger"
) )
// Config stores tcp server properties // Config stores tcp server properties
@@ -46,27 +47,30 @@ func ListenAndServeWithSignal(cfg *Config, handler tcp.Handler) error {
return nil return nil
} }
// ListenAndServe binds port and handle requests, blocking until close
// ListenAndServe binds port and handle requests, blocking until close // ListenAndServe binds port and handle requests, blocking until close
func ListenAndServe(listener net.Listener, handler tcp.Handler, closeChan <-chan struct{}) { func ListenAndServe(listener net.Listener, handler tcp.Handler, closeChan <-chan struct{}) {
// listen signal // listen signal
errCh := make(chan error)
defer close(errCh)
go func() { go func() {
<-closeChan select {
case <-closeChan:
logger.Info("get exit signal")
case er := <-errCh:
logger.Info(fmt.Sprintf("accept error: %s", er.Error()))
}
logger.Info("shutting down...") logger.Info("shutting down...")
_ = listener.Close() // listener.Accept() will return err immediately _ = listener.Close() // listener.Accept() will return err immediately
_ = handler.Close() // close connections _ = handler.Close() // close connections
}() }()
// listen port
defer func() {
// close during unexpected error
_ = listener.Close()
_ = handler.Close()
}()
ctx := context.Background() ctx := context.Background()
var waitDone sync.WaitGroup var waitDone sync.WaitGroup
for { for {
conn, err := listener.Accept() conn, err := listener.Accept()
if err != nil { if err != nil {
errCh <- err
break break
} }
// handle // handle