Cache puppet virtual module misses; drop remote query forwarding
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful

This commit is contained in:
2026-10-20 00:30:40 +11:00
parent fcc2672c4b
commit fa53bc7ded
6 changed files with 36 additions and 59 deletions
+12 -3
View File
@@ -34,11 +34,13 @@ type PuppetMember struct {
}
// PuppetDoc is a module's merged releases, newest version first, with
// file_uri routed via the virtual; Owners maps each version to its member.
// file_uri routed via the virtual; Owners maps each version to its member;
// missing caches that no member has the module.
type PuppetDoc struct {
Releases []map[string]any
Owners map[string]string
body []byte
missing bool
}
func (d *PuppetDoc) index() []byte { return d.body }
@@ -114,7 +116,11 @@ func (e *Engine) PuppetReleases(ctx context.Context, virt models.Virtual, slug s
if err != nil {
return nil, err
}
return MergePuppetReleases(slug, members)
d, err := MergePuppetReleases(slug, members)
if errors.Is(err, ErrNotFound) {
return &PuppetDoc{missing: true}, nil
}
return d, err
})
if err != nil {
return nil, err
@@ -122,7 +128,10 @@ func (e *Engine) PuppetReleases(ctx context.Context, virt models.Virtual, slug s
if inserted {
e.evictOldest(prefix, maxPuppetModules)
}
return repo.(*PuppetDoc), nil
if d := repo.(*PuppetDoc); !d.missing {
return d, nil
}
return nil, ErrNotFound
}
// PuppetRedirect maps v3/releases/<slug>-<version> or v3/files/<file> to the
+23
View File
@@ -180,3 +180,26 @@ func TestPuppetRedirect(t *testing.T) {
}
}
}
func TestPuppetReleasesCachesMissingModule(t *testing.T) {
var mu sync.Mutex
asked := map[string]int{}
e := puppetEngine(func(r models.Remote, p string) ([]byte, error) {
mu.Lock()
asked[r.Name]++
mu.Unlock()
if r.Name == "internal" {
return nil, &proxy.ProxyError{Status: 404}
}
return forgePages("unkin-nope", nil, p)
})
virt := models.Virtual{Name: "puppet", PackageType: models.PackagePuppet, Members: []string{"internal", "forge"}}
for range 2 {
if _, err := e.PuppetReleases(context.Background(), virt, "unkin-nope"); !errors.Is(err, ErrNotFound) {
t.Fatalf("want ErrNotFound, got %v", err)
}
}
if asked["internal"] != 1 || asked["forge"] != 1 {
t.Fatalf("a module no member has must be cached, asked %v", asked)
}
}