Skip to content

Commit

Permalink
feat: compute fallback Go versions
Browse files Browse the repository at this point in the history
  • Loading branch information
x1unix committed Dec 15, 2024
1 parent edfaf02 commit cd7bd95
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 2 deletions.
32 changes: 32 additions & 0 deletions internal/server/backendinfo/fallback.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package backendinfo

import (
"strconv"
"strings"
)

func prefillFallbacks(info *BackendVersions) {
if info.PreviousStable == "" {
info.PreviousStable = guessPreviousVersion(info.CurrentStable)
}

if info.Nightly == "" {
info.Nightly = "devel"
}
}

func guessPreviousVersion(baseVer string) string {
chunks := strings.Split(baseVer, ".")
if len(chunks) < 2 {
return baseVer
}

minorVer, err := strconv.Atoi(chunks[1])
if err != nil {
return baseVer
}

minorVer = max(0, minorVer-1)
return chunks[0] + "." + strconv.Itoa(minorVer) + ".0"
}

25 changes: 23 additions & 2 deletions internal/server/backendinfo/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ func (svc *BackendVersionService) visitCache() (*cacheEntry, error) {
return svc.memCache, nil
}

if svc.cfg.CacheFile == "" {
return nil, fs.ErrNotExist
}

f, err := os.Open(svc.cfg.CacheFile)
if err != nil {
return nil, err
Expand Down Expand Up @@ -132,6 +136,10 @@ func (svc *BackendVersionService) cacheVersions(versions *BackendVersions) error
Data: *versions,
}

if svc.cfg.CacheFile == "" {
return nil
}

err := os.MkdirAll(filepath.Dir(svc.cfg.CacheFile), 0755)
if err != nil {
return fmt.Errorf("MkdirAll failed: %w", err)
Expand Down Expand Up @@ -174,8 +182,20 @@ func (svc *BackendVersionService) pullBackendVersions(ctx context.Context) (*Bac
svc.logger.Debug("Fetching go version for backend", zap.String("backend", e.backend))
result, err := svc.fetchGoBackendVersionWithRetry(gCtx, e.backend)
if err != nil {
return fmt.Errorf("failed to get Go version from Go playground server for backend %q: %w",
b.backend, err)
// Playground "gotip" and "goprev" backends are often broken
// and I'm getting tired of seeing 5xx responses if just one of them is dead.
//
// Throw only if stable version is down. For others - try to figure out fallback values.
if e.backend == goplay.BackendGoCurrent {
return fmt.Errorf("failed to get Go version from Go playground server for backend %q: %w",
b.backend, err)
}

svc.logger.Warn(
"can't fetch Go version for backend, will use fallback",
zap.String("backend", e.backend), zap.Error(err),
)
return nil
}

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

prefillFallbacks(versionInfo)
return versionInfo, nil
}

Expand Down
27 changes: 27 additions & 0 deletions internal/server/backendinfo/service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,27 @@ func TestBackendVersionService_GetRemoteVersions(t *testing.T) {
require.Equal(t, expect, dst.Data)
},
},
"should prefill fallbacks if one on backends is down": {
expect: BackendVersions{
CurrentStable: "1.23.1",
PreviousStable: "1.22.0",
Nightly: "devel",
},
constructor: func(t *testing.T, expect BackendVersions) *BackendVersionService {
srv := setupTestServer(BackendVersions{
CurrentStable: expect.CurrentStable,
})

logger := testutil.GetLogger(t).Desugar()
c := goplay.NewClient(srv.URL, "", 5 * time.Second)

svc := NewBackendVersionService(logger, c, ServiceConfig{
TTL: time.Hour,
})

return svc
},
},
}

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

// Simulate prod down if empty
if msg == "" {
w.WriteHeader(http.StatusBadGateway)
return
}

rsp := goplay.CompileResponse{
Events: []*goplay.CompileEvent{
{
Expand Down

0 comments on commit cd7bd95

Please sign in to comment.