Skip to content

Commit

Permalink
apiserver: Update genericapiserver to panic on listener error
Browse files Browse the repository at this point in the history
Previously runServer would try to listen again if a listener error
occurred.  This commit changes the response to a panic to allow a
process manager (systemd/kubelet/etc) to react to the failure.
  • Loading branch information
marun committed Apr 18, 2017
1 parent c9b9b38 commit 30fb3be
Showing 1 changed file with 15 additions and 40 deletions.
55 changes: 15 additions & 40 deletions staging/src/k8s.io/apiserver/pkg/server/serve.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ import (
"net"
"net/http"
"strings"
"sync"
"time"

utilruntime "k8s.io/apimachinery/pkg/util/runtime"
Expand Down Expand Up @@ -100,7 +99,6 @@ func RunServer(server *http.Server, network string, stopCh <-chan struct{}) (int
network = "tcp"
}

// first listen is synchronous (fail early!)
ln, err := net.Listen(network, server.Addr)
if err != nil {
return 0, fmt.Errorf("failed to listen on %v: %v", server.Addr, err)
Expand All @@ -113,52 +111,29 @@ func RunServer(server *http.Server, network string, stopCh <-chan struct{}) (int
return 0, fmt.Errorf("invalid listen address: %q", ln.Addr().String())
}

lock := sync.Mutex{} // to avoid we close an old listener during a listen retry
// Stop the server by closing the listener
go func() {
<-stopCh
lock.Lock()
defer lock.Unlock()
ln.Close()
}()

go func() {
defer utilruntime.HandleCrash()

for {
var listener net.Listener
listener = tcpKeepAliveListener{ln.(*net.TCPListener)}
if server.TLSConfig != nil {
listener = tls.NewListener(listener, server.TLSConfig)
}

err := server.Serve(listener)
glog.Errorf("Error serving %v (%v); will try again.", server.Addr, err)

// listen again
func() {
lock.Lock()
defer lock.Unlock()
for {
time.Sleep(15 * time.Second)

ln, err = net.Listen(network, server.Addr)
if err == nil {
return
}
select {
case <-stopCh:
return
default:
}
glog.Errorf("Error listening on %v (%v); will try again.", server.Addr, err)
}
}()

select {
case <-stopCh:
return
default:
}
var listener net.Listener
listener = tcpKeepAliveListener{ln.(*net.TCPListener)}
if server.TLSConfig != nil {
listener = tls.NewListener(listener, server.TLSConfig)
}

err := server.Serve(listener)

msg := fmt.Sprintf("Stopped listening on %s", tcpAddr.String())
select {
case <-stopCh:
glog.Info(msg)
default:
panic(fmt.Sprintf("%s due to error: %v", msg, err))
}
}()

Expand Down

0 comments on commit 30fb3be

Please sign in to comment.