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 ( import (
"fmt" "fmt"
"net"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"os" "os"
@ -46,7 +45,7 @@ func TestNginxCheck(t *testing.T) {
mux := http.NewServeMux() 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 { if err != nil {
t.Fatalf("creating tcp listener: %s", err) t.Fatalf("creating tcp listener: %s", err)
} }

View file

@ -31,6 +31,7 @@ import (
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
apiv1 "k8s.io/api/core/v1" apiv1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/ingress-nginx/internal/ingress" "k8s.io/ingress-nginx/internal/ingress"
"k8s.io/ingress-nginx/internal/nginx" "k8s.io/ingress-nginx/internal/nginx"
@ -149,13 +150,13 @@ func TestIsDynamicConfigurationEnough(t *testing.T) {
} }
func TestConfigureDynamically(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 { if err != nil {
t.Fatalf("creating tcp listener: %s", err) t.Fatalf("creating tcp listener: %s", err)
} }
defer listener.Close() 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 { if err != nil {
t.Fatalf("creating tcp listener: %s", err) t.Fatalf("creating tcp listener: %s", err)
} }
@ -303,13 +304,13 @@ func TestConfigureDynamically(t *testing.T) {
} }
func TestConfigureCertificates(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 { if err != nil {
t.Fatalf("creating tcp listener: %s", err) t.Fatalf("creating tcp listener: %s", err)
} }
defer listener.Close() 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 { if err != nil {
t.Fatalf("creating tcp listener: %s", err) 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)) 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"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"strings"
"testing" "testing"
"time" "time"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/ingress-nginx/internal/nginx" "k8s.io/ingress-nginx/internal/nginx"
) )
@ -96,7 +99,7 @@ func TestStatusCollector(t *testing.T) {
for _, c := range cases { for _, c := range cases {
t.Run(c.name, func(t *testing.T) { 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 { if err != nil {
t.Fatalf("crating unix listener: %s", err) 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
}