Skip to content

Commit 30fb3be

Browse files
committed
apiserver: Update genericapiserver to panic on listener error
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.
1 parent c9b9b38 commit 30fb3be

File tree

1 file changed

+15
-40
lines changed
  • staging/src/k8s.io/apiserver/pkg/server

1 file changed

+15
-40
lines changed

staging/src/k8s.io/apiserver/pkg/server/serve.go

+15-40
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
"net"
2424
"net/http"
2525
"strings"
26-
"sync"
2726
"time"
2827

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

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

116-
lock := sync.Mutex{} // to avoid we close an old listener during a listen retry
114+
// Stop the server by closing the listener
117115
go func() {
118116
<-stopCh
119-
lock.Lock()
120-
defer lock.Unlock()
121117
ln.Close()
122118
}()
123119

124120
go func() {
125121
defer utilruntime.HandleCrash()
126122

127-
for {
128-
var listener net.Listener
129-
listener = tcpKeepAliveListener{ln.(*net.TCPListener)}
130-
if server.TLSConfig != nil {
131-
listener = tls.NewListener(listener, server.TLSConfig)
132-
}
133-
134-
err := server.Serve(listener)
135-
glog.Errorf("Error serving %v (%v); will try again.", server.Addr, err)
136-
137-
// listen again
138-
func() {
139-
lock.Lock()
140-
defer lock.Unlock()
141-
for {
142-
time.Sleep(15 * time.Second)
143-
144-
ln, err = net.Listen(network, server.Addr)
145-
if err == nil {
146-
return
147-
}
148-
select {
149-
case <-stopCh:
150-
return
151-
default:
152-
}
153-
glog.Errorf("Error listening on %v (%v); will try again.", server.Addr, err)
154-
}
155-
}()
156-
157-
select {
158-
case <-stopCh:
159-
return
160-
default:
161-
}
123+
var listener net.Listener
124+
listener = tcpKeepAliveListener{ln.(*net.TCPListener)}
125+
if server.TLSConfig != nil {
126+
listener = tls.NewListener(listener, server.TLSConfig)
127+
}
128+
129+
err := server.Serve(listener)
130+
131+
msg := fmt.Sprintf("Stopped listening on %s", tcpAddr.String())
132+
select {
133+
case <-stopCh:
134+
glog.Info(msg)
135+
default:
136+
panic(fmt.Sprintf("%s due to error: %v", msg, err))
162137
}
163138
}()
164139

0 commit comments

Comments
 (0)