mirror of
				https://gitea.com/gitea/gitea-mcp.git
				synced 2025-10-31 02:11: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