Skip to content

Commit cd7bd95

Browse files
committed
feat: compute fallback Go versions
1 parent edfaf02 commit cd7bd95

File tree

3 files changed

+82
-2
lines changed

3 files changed

+82
-2
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package backendinfo
2+
3+
import (
4+
"strconv"
5+
"strings"
6+
)
7+
8+
func prefillFallbacks(info *BackendVersions) {
9+
if info.PreviousStable == "" {
10+
info.PreviousStable = guessPreviousVersion(info.CurrentStable)
11+
}
12+
13+
if info.Nightly == "" {
14+
info.Nightly = "devel"
15+
}
16+
}
17+
18+
func guessPreviousVersion(baseVer string) string {
19+
chunks := strings.Split(baseVer, ".")
20+
if len(chunks) < 2 {
21+
return baseVer
22+
}
23+
24+
minorVer, err := strconv.Atoi(chunks[1])
25+
if err != nil {
26+
return baseVer
27+
}
28+
29+
minorVer = max(0, minorVer-1)
30+
return chunks[0] + "." + strconv.Itoa(minorVer) + ".0"
31+
}
32+

internal/server/backendinfo/service.go

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ func (svc *BackendVersionService) visitCache() (*cacheEntry, error) {
7777
return svc.memCache, nil
7878
}
7979

80+
if svc.cfg.CacheFile == "" {
81+
return nil, fs.ErrNotExist
82+
}
83+
8084
f, err := os.Open(svc.cfg.CacheFile)
8185
if err != nil {
8286
return nil, err
@@ -132,6 +136,10 @@ func (svc *BackendVersionService) cacheVersions(versions *BackendVersions) error
132136
Data: *versions,
133137
}
134138

139+
if svc.cfg.CacheFile == "" {
140+
return nil
141+
}
142+
135143
err := os.MkdirAll(filepath.Dir(svc.cfg.CacheFile), 0755)
136144
if err != nil {
137145
return fmt.Errorf("MkdirAll failed: %w", err)
@@ -174,8 +182,20 @@ func (svc *BackendVersionService) pullBackendVersions(ctx context.Context) (*Bac
174182
svc.logger.Debug("Fetching go version for backend", zap.String("backend", e.backend))
175183
result, err := svc.fetchGoBackendVersionWithRetry(gCtx, e.backend)
176184
if err != nil {
177-
return fmt.Errorf("failed to get Go version from Go playground server for backend %q: %w",
178-
b.backend, err)
185+
// Playground "gotip" and "goprev" backends are often broken
186+
// and I'm getting tired of seeing 5xx responses if just one of them is dead.
187+
//
188+
// Throw only if stable version is down. For others - try to figure out fallback values.
189+
if e.backend == goplay.BackendGoCurrent {
190+
return fmt.Errorf("failed to get Go version from Go playground server for backend %q: %w",
191+
b.backend, err)
192+
}
193+
194+
svc.logger.Warn(
195+
"can't fetch Go version for backend, will use fallback",
196+
zap.String("backend", e.backend), zap.Error(err),
197+
)
198+
return nil
179199
}
180200

181201
// We don't afraid race condition because each backend is written to a separate address
@@ -188,6 +208,7 @@ func (svc *BackendVersionService) pullBackendVersions(ctx context.Context) (*Bac
188208
return nil, err
189209
}
190210

211+
prefillFallbacks(versionInfo)
191212
return versionInfo, nil
192213
}
193214

internal/server/backendinfo/service_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,27 @@ func TestBackendVersionService_GetRemoteVersions(t *testing.T) {
130130
require.Equal(t, expect, dst.Data)
131131
},
132132
},
133+
"should prefill fallbacks if one on backends is down": {
134+
expect: BackendVersions{
135+
CurrentStable: "1.23.1",
136+
PreviousStable: "1.22.0",
137+
Nightly: "devel",
138+
},
139+
constructor: func(t *testing.T, expect BackendVersions) *BackendVersionService {
140+
srv := setupTestServer(BackendVersions{
141+
CurrentStable: expect.CurrentStable,
142+
})
143+
144+
logger := testutil.GetLogger(t).Desugar()
145+
c := goplay.NewClient(srv.URL, "", 5 * time.Second)
146+
147+
svc := NewBackendVersionService(logger, c, ServiceConfig{
148+
TTL: time.Hour,
149+
})
150+
151+
return svc
152+
},
153+
},
133154
}
134155

135156
for n, c := range cases {
@@ -177,6 +198,12 @@ func setupTestServer(expects BackendVersions) *httptest.Server {
177198
msg = expects.CurrentStable
178199
}
179200

201+
// Simulate prod down if empty
202+
if msg == "" {
203+
w.WriteHeader(http.StatusBadGateway)
204+
return
205+
}
206+
180207
rsp := goplay.CompileResponse{
181208
Events: []*goplay.CompileEvent{
182209
{

0 commit comments

Comments
 (0)