mirror of
https://gitea.com/gitea/gitea-mcp.git
synced 2025-10-13 17:41:50 +00:00
feat: implement graceful server shutdown on interrupt or SIGTERM (#98)
- 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: https://gitea.com/gitea/gitea-mcp/pulls/98 Co-authored-by: appleboy <appleboy.tw@gmail.com> Co-committed-by: appleboy <appleboy.tw@gmail.com>
This commit is contained in:
@@ -4,7 +4,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
"strings"
|
"strings"
|
||||||
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.com/gitea/gitea-mcp/operation/issue"
|
"gitea.com/gitea/gitea-mcp/operation/issue"
|
||||||
@@ -100,9 +103,27 @@ func Run() error {
|
|||||||
server.WithHTTPContextFunc(getContextWithToken),
|
server.WithHTTPContextFunc(getContextWithToken),
|
||||||
)
|
)
|
||||||
log.Infof("Gitea MCP HTTP server listening on :%d", flag.Port)
|
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 {
|
if err := httpServer.Start(fmt.Sprintf(":%d", flag.Port)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
<-shutdownDone // Wait for shutdown to finish
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("invalid transport type: %s. Must be 'stdio' or 'http'", flag.Mode)
|
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(),
|
server.WithRecovery(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user