WIP: Avoid reloads implementing Equals in structs
This commit is contained in:
parent
e9871ffaad
commit
75a4a61254
12 changed files with 701 additions and 11 deletions
|
|
@ -18,6 +18,7 @@ package controller
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"os"
|
||||
"reflect"
|
||||
"sort"
|
||||
|
|
@ -108,6 +109,8 @@ type GenericController struct {
|
|||
stopLock *sync.Mutex
|
||||
|
||||
stopCh chan struct{}
|
||||
|
||||
runningConfig *ingress.Configuration
|
||||
}
|
||||
|
||||
// Configuration contains all the settings required by an Ingress controller
|
||||
|
|
@ -400,14 +403,22 @@ func (ic *GenericController) syncIngress(key interface{}) error {
|
|||
}
|
||||
}
|
||||
|
||||
err := ic.cfg.Backend.OnUpdate(ingress.Configuration{
|
||||
pcfg := ingress.Configuration{
|
||||
Backends: upstreams,
|
||||
Servers: servers,
|
||||
TCPEndpoints: ic.getStreamServices(ic.cfg.TCPConfigMapName, api.ProtocolTCP),
|
||||
UDPEndpoints: ic.getStreamServices(ic.cfg.UDPConfigMapName, api.ProtocolUDP),
|
||||
PassthroughBackends: passUpstreams,
|
||||
})
|
||||
}
|
||||
|
||||
if ic.runningConfig != nil && ic.runningConfig.Equal(&pcfg) {
|
||||
glog.Infof("skipping backend reload (no changes detected)")
|
||||
return nil
|
||||
}
|
||||
|
||||
glog.Infof("backend reload required")
|
||||
|
||||
err := ic.cfg.Backend.OnUpdate(pcfg)
|
||||
if err != nil {
|
||||
incReloadErrorCount()
|
||||
glog.Errorf("unexpected failure restarting the backend: \n%v", err)
|
||||
|
|
@ -418,6 +429,8 @@ func (ic *GenericController) syncIngress(key interface{}) error {
|
|||
incReloadCount()
|
||||
setSSLExpireTime(servers)
|
||||
|
||||
ic.runningConfig = &pcfg
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
@ -679,9 +692,6 @@ func (ic *GenericController) getBackendServers() ([]*ingress.Backend, []*ingress
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: find a way to make this more readable
|
||||
// The structs must be ordered to always generate the same file
|
||||
// if the content does not change.
|
||||
aUpstreams := make([]*ingress.Backend, 0, len(upstreams))
|
||||
for _, value := range upstreams {
|
||||
if len(value.Endpoints) == 0 {
|
||||
|
|
@ -690,7 +700,6 @@ func (ic *GenericController) getBackendServers() ([]*ingress.Backend, []*ingress
|
|||
}
|
||||
aUpstreams = append(aUpstreams, value)
|
||||
}
|
||||
sort.Sort(ingress.BackendByNameServers(aUpstreams))
|
||||
|
||||
aServers := make([]*ingress.Server, 0, len(servers))
|
||||
for _, value := range servers {
|
||||
|
|
@ -847,12 +856,17 @@ func (ic *GenericController) serviceEndpoints(svcKey, backendPort string,
|
|||
glog.Warningf("service %v does not have any active endpoints", svcKey)
|
||||
}
|
||||
|
||||
sort.Sort(ingress.EndpointByAddrPort(endps))
|
||||
upstreams = append(upstreams, endps...)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
for i := range upstreams {
|
||||
j := rand.Intn(i + 1)
|
||||
upstreams[i], upstreams[j] = upstreams[j], upstreams[i]
|
||||
}
|
||||
|
||||
return upstreams, nil
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue