fix: use exponential backoff mechanism to listen on nginx.StatusPort

This commit is contained in:
tokers 2021-05-13 15:02:11 +08:00
parent 714783c052
commit a08887040b
3 changed files with 54 additions and 7 deletions

View file

@ -18,7 +18,6 @@ package controller
import (
"fmt"
"net"
"net/http"
"net/http/httptest"
"os"
@ -46,7 +45,7 @@ func TestNginxCheck(t *testing.T) {
mux := http.NewServeMux()
listener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
listener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
if err != nil {
t.Fatalf("creating tcp listener: %s", err)
}

View file

@ -31,6 +31,7 @@ import (
jsoniter "github.com/json-iterator/go"
apiv1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/ingress-nginx/internal/ingress"
"k8s.io/ingress-nginx/internal/nginx"
@ -149,13 +150,13 @@ func TestIsDynamicConfigurationEnough(t *testing.T) {
}
func TestConfigureDynamically(t *testing.T) {
listener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
listener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
if err != nil {
t.Fatalf("creating tcp listener: %s", err)
}
defer listener.Close()
streamListener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StreamPort))
streamListener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StreamPort))
if err != nil {
t.Fatalf("creating tcp listener: %s", err)
}
@ -303,13 +304,13 @@ func TestConfigureDynamically(t *testing.T) {
}
func TestConfigureCertificates(t *testing.T) {
listener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
listener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
if err != nil {
t.Fatalf("creating tcp listener: %s", err)
}
defer listener.Close()
streamListener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StreamPort))
streamListener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StreamPort))
if err != nil {
t.Fatalf("creating tcp listener: %s", err)
}
@ -525,3 +526,25 @@ func TestCleanTempNginxCfg(t *testing.T) {
t.Errorf("expected one file but %d were found", len(files))
}
}
func tryListen(network, address string) (l net.Listener, err error) {
condFunc := func() (bool, error) {
l, err = net.Listen(network, address)
if err == nil {
return true, nil
}
if strings.Contains(err.Error(), "bind: address already in use") {
return false, nil
}
return false, err
}
backoff := wait.Backoff{
Duration: 500 * time.Millisecond,
Factor: 2,
Steps: 6,
Cap: 128 * time.Second,
}
err = wait.ExponentialBackoff(backoff, condFunc)
return
}

View file

@ -21,10 +21,13 @@ import (
"net"
"net/http"
"net/http/httptest"
"strings"
"testing"
"time"
"github.com/prometheus/client_golang/prometheus"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/ingress-nginx/internal/nginx"
)
@ -96,7 +99,7 @@ func TestStatusCollector(t *testing.T) {
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
listener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
listener, err := tryListen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
if err != nil {
t.Fatalf("crating unix listener: %s", err)
}
@ -147,3 +150,25 @@ func TestStatusCollector(t *testing.T) {
})
}
}
func tryListen(network, address string) (l net.Listener, err error) {
condFunc := func() (bool, error) {
l, err = net.Listen(network, address)
if err == nil {
return true, nil
}
if strings.Contains(err.Error(), "bind: address already in use") {
return false, nil
}
return false, err
}
backoff := wait.Backoff{
Duration: 500 * time.Millisecond,
Factor: 2,
Steps: 6,
Cap: 128 * time.Second,
}
err = wait.ExponentialBackoff(backoff, condFunc)
return
}