From 3f08901e844eda6c67b44e869c08ef9dc11265e4 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sun, 17 Aug 2025 04:20:09 +0800 Subject: [PATCH] Fix a few other goroutine leaks with contexts --- forged/internal/incoming/hooks/hooks.go | 5 ++++- forged/internal/incoming/lmtp/config.go | 4 ++++ forged/internal/incoming/ssh/ssh.go | 4 ++++ forged/internal/incoming/web/web.go | 3 +++ forged/internal/server/server.go | 48 ++++++++++++++++++++---------------------------- diff --git a/forged/internal/incoming/hooks/hooks.go b/forged/internal/incoming/hooks/hooks.go index c02140608d5b7ad312cf2fbe2f32ce048058927f..3be081121758fb799d80d1b96104c649895fb3fa 100644 --- a/forged/internal/incoming/hooks/hooks.go +++ b/forged/internal/incoming/hooks/hooks.go @@ -2,6 +2,7 @@ package hooks import ( "context" + "errors" "fmt" "net" @@ -59,7 +60,9 @@ for { conn, err := listener.Accept() if err != nil { - // TODO: Handle errors caused by context cancel + if errors.Is(err, net.ErrClosed) { + return nil + } return fmt.Errorf("accept conn: %w", err) } diff --git a/forged/internal/incoming/lmtp/config.go b/forged/internal/incoming/lmtp/config.go index c622648488bcbe029c8335c7c323f80cbd76ee01..ce32f3dbfbccd567fc2f60162675aec80d063582 100644 --- a/forged/internal/incoming/lmtp/config.go +++ b/forged/internal/incoming/lmtp/config.go @@ -2,6 +2,7 @@ package lmtp import ( "context" + "errors" "fmt" "net" @@ -52,6 +53,9 @@ for { conn, err := listener.Accept() if err != nil { + if errors.Is(err, net.ErrClosed) { + return nil + } return fmt.Errorf("accept conn: %w", err) } diff --git a/forged/internal/incoming/ssh/ssh.go b/forged/internal/incoming/ssh/ssh.go index efa24f11ab828bcea93e34bdf54bc5033e164a9e..77812d12689997223f2750757b34bf5ebee25a1d 100644 --- a/forged/internal/incoming/ssh/ssh.go +++ b/forged/internal/incoming/ssh/ssh.go @@ -2,6 +2,7 @@ package ssh import ( "context" + "errors" "fmt" "os" @@ -68,6 +69,9 @@ // TODO: Log the error }() if err = server.gliderServer.Serve(listener); err != nil { + if errors.Is(err, gliderssh.ErrServerClosed) { + return nil + } return fmt.Errorf("serve SSH: %w", err) } panic("unreachable") diff --git a/forged/internal/incoming/web/web.go b/forged/internal/incoming/web/web.go index a95b650f73ad2ecbcc2b101aec9887a8f9e80627..f66ad64255865171e039c789b03eed1b70a8c7e5 100644 --- a/forged/internal/incoming/web/web.go +++ b/forged/internal/incoming/web/web.go @@ -63,6 +63,9 @@ // TODO: Log the error }() if err = server.httpServer.Serve(listener); err != nil { + if err == http.ErrServerClosed { + return nil + } return fmt.Errorf("serve web: %w", err) } panic("unreachable") diff --git a/forged/internal/server/server.go b/forged/internal/server/server.go index 867e54fc269551f4b2fe3894c28fb9d52095e91b..472df7a30db421edda1888693292749214fa1e8e 100644 --- a/forged/internal/server/server.go +++ b/forged/internal/server/server.go @@ -62,46 +62,38 @@ errCh := make(chan error) go func() { - err := server.hookServer.Run(subCtx) - if err == nil { - panic("hook server should never return nil error") - } - select { - case errCh <- err: - default: + if err := server.hookServer.Run(subCtx); err != nil { + select { + case errCh <- err: + default: + } } }() go func() { - err := server.lmtpServer.Run(subCtx) - if err == nil { - panic("lmtp server should never return nil error") - } - select { - case errCh <- err: - default: + if err := server.lmtpServer.Run(subCtx); err != nil { + select { + case errCh <- err: + default: + } } }() go func() { - err := server.webServer.Run(subCtx) - if err == nil { - panic("web server should never return nil error") - } - select { - case errCh <- err: - default: + if err := server.webServer.Run(subCtx); err != nil { + select { + case errCh <- err: + default: + } } }() go func() { - err := server.sshServer.Run(subCtx) - if err == nil { - panic("ssh server should never return nil error") - } - select { - case errCh <- err: - default: + if err := server.sshServer.Run(subCtx); err != nil { + select { + case errCh <- err: + default: + } } }() -- 2.48.1