Skip to content

Commit cc13e47

Browse files
committed
Fix issue where server pool could fail empty due to haproxy being alive but not fully up.
1 parent f954144 commit cc13e47

File tree

5 files changed

+61
-8
lines changed

5 files changed

+61
-8
lines changed

.github/workflows/goreleaser.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
- name: Set up Go
2020
uses: actions/setup-go@v2
2121
with:
22-
go-version: 1.17
22+
go-version: 1.21
2323

2424
- name: Run GoReleaser
2525
uses: goreleaser/goreleaser-action@v2

.goreleaser.yml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,7 @@ builds:
1818
- arm64
1919

2020
archives:
21-
- replacements:
22-
darwin: Darwin
23-
linux: Linux
24-
amd64: x86_64
25-
name_template: "{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}"
21+
- name_template: '{{ .ProjectName }}_{{- title .Os -}}_{{- if (or (eq .Arch "amd64") (eq .Arch "amd64_v1")) }}x86_64{{- else -}}{{ .Arch }}{{ end -}}'
2622

2723
checksum:
2824
name_template: 'checksums.txt'

internal/haproxy/info.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package haproxy
22

33
import (
4+
"errors"
5+
46
log "github.com/sirupsen/logrus"
57
)
68

@@ -28,6 +30,10 @@ func (c *Client) GetBackendNames() ([]string, error) {
2830
backends = append(backends, backend.Name)
2931
}
3032

33+
if len(backends) == 0 {
34+
return nil, errors.New("no backends found")
35+
}
36+
3137
return backends, nil
3238
}
3339

@@ -49,6 +55,13 @@ func (c *Client) GetServerNames(backend string) ([]string, error) {
4955
servers = append(servers, server.Name)
5056
}
5157

58+
if len(servers) == 0 {
59+
log.WithFields(log.Fields{
60+
"backend": backend,
61+
}).Error("no servers for backend")
62+
return nil, errors.New("no servers for backend")
63+
}
64+
5265
return servers, nil
5366
}
5467

internal/mapper/mapper.go

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,46 @@ func New(backend string, haProxyClient *haproxy.Client, useExternal bool) (Backe
2828
return mapper, nil
2929
}
3030

31-
func (m *Mapper) nextServer() (string, error) {
31+
func (m *Mapper) getServer() (string, error) {
3232
var next string
3333
if len(m.serverPool) == 0 {
3434
log.WithFields(log.Fields{
3535
"backend": m.backend,
3636
}).Warn("server pool exhausted")
37-
return "", fmt.Errorf("server pool exhausted")
37+
38+
return "", fmt.Errorf("server pool exhausted")
3839
}
3940

4041
next, m.serverPool = m.serverPool[0], m.serverPool[1:]
4142

4243
return next, nil
4344
}
4445

46+
func (m* Mapper) nextServer() (string, error) {
47+
next, err := m.getServer()
48+
if err == nil {
49+
return next, nil
50+
}
51+
52+
// Attempt to reset the server pool since we don't seem to have any
53+
if len(m.serverMap) == 0 {
54+
log.WithFields(log.Fields{
55+
"backend": m.backend,
56+
}).Info("no servers configured, attempting to reset server pool")
57+
58+
if err := m.resetServerPool(); err != nil {
59+
log.WithFields(log.Fields{
60+
"backend": m.backend,
61+
}).Warn("unble to reset server pool")
62+
63+
return "", err
64+
}
65+
}
66+
67+
// try again.
68+
return m.getServer()
69+
}
70+
4571
func (m *Mapper) releaseServer(server string) {
4672
m.serverPool = append(m.serverPool, server)
4773
}

internal/mapper/sync_all.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,28 @@
11
package mapper
22

33
import (
4+
"errors"
5+
"time"
6+
47
log "github.com/sirupsen/logrus"
58
)
69

710
func (m *Mapper) resetServerPool() error {
11+
// HAProxy can take a moment to start up
12+
for retries := 0; retries < 5; retries++ {
13+
if err := m.tryResetServerPool(); err == nil {
14+
return nil
15+
}
16+
log.WithFields(log.Fields{
17+
"retries": retries,
18+
}).Warn("unable to load servers for backend")
19+
time.Sleep(5 * time.Second)
20+
}
21+
22+
return errors.New("could not load servers for backend, failing")
23+
}
24+
25+
func (m *Mapper) tryResetServerPool() error {
826
// Populate pool of servers
927
serverPool, err := m.haProxyClient.GetServerNames(m.backend)
1028
if err != nil {

0 commit comments

Comments
 (0)