diff --git a/CHANGELOG.md b/CHANGELOG.md index baddbd5c..ceb9933e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ This release brings some improvements and bugfixes. ### Fixed - Fixed iphash algorithm. It was not working properly at all - Fixed UDP 'session' tracking problems +- Fixed active connections underflow on backend removed and added back, but connections remain established ### Changed - Removed not necessary dependency on libacl1-dev diff --git a/src/core/backend.go b/src/core/backend.go index 0d3fa1f1..db415975 100644 --- a/src/core/backend.go +++ b/src/core/backend.go @@ -27,6 +27,7 @@ type Backend struct { */ type BackendStats struct { Live bool `json:"live"` + Discovered bool `json:"discovered"` TotalConnections int64 `json:"total_connections"` ActiveConnections uint `json:"active_connections"` RefusedConnections uint64 `json:"refused_connections"` diff --git a/src/server/scheduler/scheduler.go b/src/server/scheduler/scheduler.go index 0f5ddcda..3c5e3036 100644 --- a/src/server/scheduler/scheduler.go +++ b/src/server/scheduler/scheduler.go @@ -97,6 +97,7 @@ func (this *Scheduler) Start() { this.ops = make(chan Op) this.elect = make(chan ElectRequest) this.stop = make(chan bool) + this.backends = make(map[core.Target]*core.Backend) this.Discovery.Start() this.Healthcheck.Start() @@ -221,23 +222,35 @@ func (this *Scheduler) HandleBackendLiveChange(target core.Target, live bool) { */ func (this *Scheduler) HandleBackendsUpdate(backends []core.Backend) { - updated := map[core.Target]*core.Backend{} + // first mark all existing backends as not discovered + for _, b := range this.backends { + b.Stats.Discovered = false + } for _, b := range backends { oldB, ok := this.backends[b.Target] if ok { // if we have this backend, update it's discovery properties - updatedB := oldB.MergeFrom(b) - updated[oldB.Target] = updatedB + oldB.MergeFrom(b) + // mark found backend as discovered + oldB.Stats.Discovered = true continue } b := b // b has to be local variable in order to make unique pointers - updated[b.Target] = &b + b.Stats.Discovered = true + this.backends[b.Target] = &b + } + + //remove not discovered backends without active connections + for t, b := range this.backends { + if b.Stats.Discovered || b.Stats.ActiveConnections > 0 { + continue + } + delete(this.backends, t) } - this.backends = updated } /** @@ -245,7 +258,7 @@ func (this *Scheduler) HandleBackendsUpdate(backends []core.Backend) { */ func (this *Scheduler) HandleBackendElect(req ElectRequest) { - // Filter only live backends + // Filter only live and discovered backends var backends []*core.Backend for _, b := range this.backends { @@ -253,6 +266,10 @@ func (this *Scheduler) HandleBackendElect(req ElectRequest) { continue } + if !b.Stats.Discovered { + continue + } + backends = append(backends, b) }