feat: implement graceful server shutdown on interrupt or SIGTERM (#98)
All checks were successful
release-nightly / release-image (push) Successful in 1m6s

- Add graceful shutdown for HTTP server on interrupt or SIGTERM signals - Wait for server to finish shutting down before exiting Signed-off-by: appleboy <appleboy.tw@gmail.com> Reviewed-on: #98 Co-authored-by: appleboy <appleboy.tw@gmail.com> Co-committed-by: appleboy <appleboy.tw@gmail.com>
This commit was merged in pull request #98.
This commit is contained in:
2025-09-27 08:56:41 +00:00
committed by Bo-Yi Wu (吳柏毅)
parent 8c028ec48b
commit 32eaf86426

View File

@@ -4,7 +4,10 @@ import (
"context"
"fmt"
"net/http"
"os"
"os/signal"
"strings"
"syscall"
"time"
"gitea.com/gitea/gitea-mcp/operation/issue"
@@ -100,9 +103,27 @@ func Run() error {
server.WithHTTPContextFunc(getContextWithToken),
)
log.Infof("Gitea MCP HTTP server listening on :%d", flag.Port)
// Graceful shutdown setup
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM)
shutdownDone := make(chan struct{})
go func() {
<-sigCh
log.Infof("Shutdown signal received, gracefully stopping HTTP server...")
shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
if err := httpServer.Shutdown(shutdownCtx); err != nil {
log.Errorf("HTTP server shutdown error: %v", err)
}
close(shutdownDone)
}()
if err := httpServer.Start(fmt.Sprintf(":%d", flag.Port)); err != nil {
return err
}
<-shutdownDone // Wait for shutdown to finish
default:
return fmt.Errorf("invalid transport type: %s. Must be 'stdio' or 'http'", flag.Mode)
}
@@ -118,4 +139,3 @@ func newMCPServer(version string) *server.MCPServer {
server.WithRecovery(),
)
}