From 67ca39467fbbaa1b1f240794e006b7695f7544f4 Mon Sep 17 00:00:00 2001 From: Chin-Ya Huang Date: Fri, 2 Feb 2024 08:59:51 +0800 Subject: [PATCH] fix(profiler): data race accessing s.server Signed-off-by: Chin-Ya Huang --- profiler/profiler.go | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/profiler/profiler.go b/profiler/profiler.go index 3ecd190e..9d6064a3 100644 --- a/profiler/profiler.go +++ b/profiler/profiler.go @@ -164,33 +164,37 @@ func (s *Server) EnableProfiler(portNumber int32) (string, error) { } profilerAddr := fmt.Sprintf(":%d", profilerPort) - s.server = &http.Server{ + newServer := &http.Server{ Addr: profilerAddr, ReadHeaderTimeout: 10 * time.Second, } go func() { - if err := s.server.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { - logrus.WithError(err).Warnf("Get error when start profiler server %v", s.server.Addr) - s.server = nil + if err := newServer.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { + logrus.WithError(err).Warnf("Get error when start profiler server %v", newServer.Addr) s.errMsg = err.Error() return } - logrus.Infof("Profiler server (%v) is closed", s.server.Addr) + logrus.Infof("Profiler server (%v) is closed", newServer.Addr) }() - logrus.Infof("Waiting the profiler server(%v) to start", s.server.Addr) + logrus.Infof("Waiting the profiler server(%v) to start", newServer.Addr) // Wait for the profiler server to start, and check the profiler server. retryCount := 3 for i := 0; i < retryCount; i++ { - conn, err := net.DialTimeout("tcp", s.server.Addr, 1*time.Second) + conn, err := net.DialTimeout("tcp", newServer.Addr, 1*time.Second) if err == nil { _ = conn.Close() break } } - if s.server == nil { + + if s.errMsg != "" { + _ = newServer.Close() return s.errMsg, fmt.Errorf("failed to start profiler server(%v)", profilerAddr) } + + s.server = newServer + defer func() { s.errMsg = "" }()