diff --git a/src/collector/collector.go b/src/collector/collector.go index a41456152b8a751efa1b3f55d14ea4814ee2b476..6963f0a41ce040c252dfe32d9464c9202630b550 100644 --- a/src/collector/collector.go +++ b/src/collector/collector.go @@ -2,8 +2,13 @@ package collector import ( + "context" "log" "net/http" + "os" + "os/signal" + "syscall" + "time" config "csudata.com/zqpool/src/config" "github.com/prometheus/client_golang/prometheus" @@ -113,12 +118,32 @@ func IncreaseBackendConnectionLimitReachedTimes(labelValue string) { } func StartPromServer() { + _, cancel := context.WithCancel(context.Background()) + defer cancel() + port := config.Get("exporter_port") if port == "" { log.Println("exporter_port not set in configuration, set port of Exporter to '9816'.") port = "9816" } - http.Handle("/metrics", promhttp.Handler()) - log.Fatal(http.ListenAndServe(":"+port, nil)) + srv := &http.Server{ + Addr: ":" + port, + Handler: promhttp.Handler(), + } + + sigint := make(chan os.Signal, 1) + signal.Notify(sigint, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-sigint + cancel() + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + if err := srv.Shutdown(ctx); err != nil { + // 如果 Shutdown 不成功,就强制关闭 + log.Printf("Server forced to shutdown: %v", err) + } + }() + log.Fatal(srv.ListenAndServe()) } diff --git a/src/poolserver/fe_be_logic.go b/src/poolserver/fe_be_logic.go index 694988c17321d2b24ad42a7ac9b5d86421aebc39..76a49817a089e6e8811d0432ecae0a6c3bb6f762 100644 --- a/src/poolserver/fe_be_logic.go +++ b/src/poolserver/fe_be_logic.go @@ -234,6 +234,10 @@ func (ctx *ConnContext) forwardToClient() (error, error) { zap.S().Infof("Client(%d): RB(%d): ERROR: %s", ctx.Pid, ctx.pBackConn.Id, backendErr.Error()) ctx.cliConn.Close() ctx.BeReconnect() + + zap.S().Debugf("Client(%d): release backend(%d)", ctx.Pid, ctx.pBackConn.Id) + atomic.StoreInt32(&ctx.pBackConn.State, 0) + ctx.isGetBackend = false return nil, backendErr } pos += n @@ -245,6 +249,10 @@ func (ctx *ConnContext) forwardToClient() (error, error) { zap.S().Infof("Client(%d): SC: ERROR: %s", ctx.Pid, clientErr.Error()) ctx.cliConn.Close() ctx.BeReconnect() + + zap.S().Debugf("Client(%d): release backend(%d)", ctx.Pid, ctx.pBackConn.Id) + atomic.StoreInt32(&ctx.pBackConn.State, 0) + ctx.isGetBackend = false return clientErr, nil }