Skip to content

Commit ceae568

Browse files
ivanmatmatiMo3m3n
authored andcommitted
BUG/MINOR: Fix backend runtime sync
This commit fixes following issue: - A change in service targetPort was not reflected in server port definition for corresponding backend. - When a change in service selector value results in an empty targets set, the backend kept its slots of servers instead of losing them.
1 parent 8854e0c commit ceae568

File tree

5 files changed

+26
-16
lines changed

5 files changed

+26
-16
lines changed

controller/haproxy/api/api.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ type HAProxyClient interface {
2525
BackendServerCreate(backendName string, data models.Server) error
2626
BackendServerEdit(backendName string, data models.Server) error
2727
BackendServerDelete(backendName string, serverName string) error
28+
BackendServersGet(backendName string) (models.Servers, error)
2829
BackendSwitchingRuleCreate(frontend string, rule models.BackendSwitchingRule) error
2930
BackendSwitchingRuleDeleteAll(frontend string)
3031
DefaultsGetConfiguration() (*models.Defaults, error)

controller/haproxy/api/backend.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,11 @@ func (c *clientNative) ServerGet(serverName, backendName string) (models.Server,
107107
}
108108
return *server, nil
109109
}
110+
111+
func (c *clientNative) BackendServersGet(backendName string) (models.Servers, error) {
112+
_, servers, err := c.nativeAPI.Configuration.GetServers(backendName, c.activeTransaction)
113+
if err != nil {
114+
return nil, err
115+
}
116+
return servers, nil
117+
}

controller/service/endpoints.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ func (s *SvcContext) HandleHAProxySrvs(client api.HAProxyClient, store store.K8s
3131
backend, err := s.getRuntimeBackend(store)
3232
if err != nil {
3333
logger.Warningf("Ingress '%s/%s': %s", s.ingress.Namespace, s.ingress.Name, err)
34+
if servers, _ := client.BackendServersGet(s.backend.Name); servers != nil {
35+
client.BackendServerDeleteAll(s.backend.Name)
36+
}
3437
return
3538
}
3639
backend.Name = s.backend.Name // set backendName in store.PortEndpoints for runtime updates.

controller/store/events.go

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -225,29 +225,28 @@ func getEndpoints(slices map[string]*Endpoints) (endpoints map[string]PortEndpoi
225225
}
226226

227227
func (k *K8s) EventEndpoints(ns *Namespace, data *Endpoints, syncHAproxySrvs func(backend *RuntimeBackend, portUpdated bool) error) (updateRequired bool) {
228-
newEndpoints := data
229-
oldEndpoints := ns.Endpoints[data.Service][data.SliceName]
230-
if oldEndpoints.Equal(newEndpoints) {
231-
return false
232-
}
233228
if _, ok := ns.Endpoints[data.Service]; !ok {
234229
ns.Endpoints[data.Service] = make(map[string]*Endpoints)
235230
}
236-
ns.Endpoints[data.Service][data.SliceName] = newEndpoints
231+
if endpoints, ok := ns.Endpoints[data.Service][data.SliceName]; ok {
232+
if data.Status != DELETED && endpoints.Equal(data) {
233+
return false
234+
}
235+
}
236+
ns.Endpoints[data.Service][data.SliceName] = data
237237

238-
for portName, portEndpoints := range getEndpoints(ns.Endpoints[data.Service]) {
238+
endpoints := getEndpoints(ns.Endpoints[data.Service])
239+
_, ok := ns.HAProxyRuntime[data.Service]
240+
if !ok || len(endpoints) == 0 {
241+
ns.HAProxyRuntime[data.Service] = make(map[string]*RuntimeBackend)
242+
}
243+
for portName, portEndpoints := range endpoints {
239244
newBackend := &RuntimeBackend{Endpoints: portEndpoints}
240-
runtime, ok := ns.HAProxyRuntime[data.Service]
241-
if !ok {
242-
runtime = make(map[string]*RuntimeBackend)
243-
ns.HAProxyRuntime[data.Service] = runtime
244-
}
245-
backend, ok := runtime[portName]
245+
backend, ok := ns.HAProxyRuntime[data.Service][portName]
246246
if ok {
247247
portUpdated := (newBackend.Endpoints.Port != backend.Endpoints.Port)
248248
newBackend.HAProxySrvs = backend.HAProxySrvs
249249
newBackend.Name = backend.Name
250-
newBackend.Endpoints.Port = backend.Endpoints.Port
251250
logger.Warning(syncHAproxySrvs(newBackend, portUpdated))
252251
}
253252
ns.HAProxyRuntime[data.Service][portName] = newBackend

deploy/tests/e2e/endpoints/http_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,13 @@ func (suite *EndpointsSuite) Test_HTTP_Reach() {
5050
}()
5151
}
5252
switch replicas {
53-
case 8:
53+
case 8, 3:
5454
// HAProxy reloaded due to scale up
5555
pid = suite.getPID()
5656
case 0:
5757
if len(counter) > 0 {
5858
return false
5959
}
60-
fallthrough
6160
default:
6261
if pid != suite.getPID() {
6362
suite.Error(fmt.Errorf("Uncessary reload of HAproxy"))

0 commit comments

Comments
 (0)