mirror of
				https://github.com/golang/go.git
				synced 2025-11-04 02:30:57 +00:00 
			
		
		
		
	net/http: Add Server.RegisterOnShutdown
This will be used to allow http2 servers to register a shutdown function so that net/http.Server.Shutdown will work when the http2 server is configured via a manual call to http2.ConfigureServer. Currently, Shutdown only works when the http2 server is configured automatically by the net/http package. Updates #20302 Updates #18471 Change-Id: Ifc2b5f3126126a106b49ea4a7e999279852b9cc9 Reviewed-on: https://go-review.googlesource.com/44003 Run-TryBot: Tom Bergan <tombergan@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
		
							parent
							
								
									6374a6607b
								
							
						
					
					
						commit
						1a63f116c1
					
				
					 2 changed files with 26 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -2395,6 +2395,7 @@ type Server struct {
 | 
			
		|||
	listeners  map[net.Listener]struct{}
 | 
			
		||||
	activeConn map[*conn]struct{}
 | 
			
		||||
	doneChan   chan struct{}
 | 
			
		||||
	onShutdown []func()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Server) getDoneChan() <-chan struct{} {
 | 
			
		||||
| 
						 | 
				
			
			@ -2475,6 +2476,9 @@ func (srv *Server) Shutdown(ctx context.Context) error {
 | 
			
		|||
	srv.mu.Lock()
 | 
			
		||||
	lnerr := srv.closeListenersLocked()
 | 
			
		||||
	srv.closeDoneChanLocked()
 | 
			
		||||
	for _, f := range srv.onShutdown {
 | 
			
		||||
		go f()
 | 
			
		||||
	}
 | 
			
		||||
	srv.mu.Unlock()
 | 
			
		||||
 | 
			
		||||
	ticker := time.NewTicker(shutdownPollInterval)
 | 
			
		||||
| 
						 | 
				
			
			@ -2491,6 +2495,17 @@ func (srv *Server) Shutdown(ctx context.Context) error {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterOnShutdown registers a function to call on Shutdown.
 | 
			
		||||
// This can be used to gracefully shutdown connections that have
 | 
			
		||||
// undergone NPN/ALPN protocol upgrade or that have been hijacked.
 | 
			
		||||
// This function should start protocol-specific graceful shutdown,
 | 
			
		||||
// but should not wait for shutdown to complete.
 | 
			
		||||
func (srv *Server) RegisterOnShutdown(f func()) {
 | 
			
		||||
	srv.mu.Lock()
 | 
			
		||||
	srv.onShutdown = append(srv.onShutdown, f)
 | 
			
		||||
	srv.mu.Unlock()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// closeIdleConns closes all idle connections and reports whether the
 | 
			
		||||
// server is quiescent.
 | 
			
		||||
func (s *Server) closeIdleConns() bool {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue