Let platform manifests go only on a confirmed collect, and copy again what a sweep took
An unrecorded index or a copy in progress can name a platform the records do not see, so only a person's collect, after its dry run, takes an index's platforms, and only once every kept index of each repository it touches was read. A copy missing a platform is copied again, and a copy a build holds again is no longer recorded as collected (review of #144).
This commit is contained in:
@@ -131,6 +131,11 @@ func (i *Inventory) RecordBuild(ctx context.Context, b Build) error {
|
||||
|
||||
// RecordMirrored keeps that the mesh copied these bases into the artifact store (novox/hq ADR 0257):
|
||||
// by the build that said so, or by a person who says why. The first record of a copy stands.
|
||||
//
|
||||
// **A copy a build says it holds is held again.** The builder answers a copy only once the store holds
|
||||
// it whole, copying again what was let go of; so a copy the records say was collected, and a build now
|
||||
// says it copied, is no longer collected. Left collected, it would stay in the store and out of every
|
||||
// sweep for ever.
|
||||
func (i *Inventory) RecordMirrored(ctx context.Context, build, why string, references []string) error {
|
||||
var by *string
|
||||
if build != "" {
|
||||
@@ -145,6 +150,12 @@ func (i *Inventory) RecordMirrored(ctx context.Context, build, why string, refer
|
||||
on conflict (reference) do nothing`, reference, by, why); err != nil {
|
||||
return err
|
||||
}
|
||||
if build != "" {
|
||||
if _, err := i.store.Pool().Exec(ctx,
|
||||
`delete from artifact_collected where reference = $1`, reference); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -179,3 +179,33 @@ func TestTheCopiesTheRecordsAlreadyNameAreRecorded(t *testing.T) {
|
||||
t.Fatalf("recorded %s by %s", reference, build)
|
||||
}
|
||||
}
|
||||
|
||||
// A copy let go of and copied again by a later build is held again: its record is back, and the sweep
|
||||
// decides about it as before.
|
||||
func TestACopyLetGoOfAndCopiedAgainIsHeldAgain(t *testing.T) {
|
||||
inv := fresh(t)
|
||||
ctx := context.Background()
|
||||
holding(t, inv, "proxy")
|
||||
golang := mirrorRef("upstream/docker.io/library/golang", 1)
|
||||
builtOn(t, inv, "b01", "proxy", 1, []string{golang}, golang)
|
||||
if err := inv.MarkCollected(ctx, []string{golang}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if s := stateOf(t, inv, golang); s.State != ArtifactCollected {
|
||||
t.Fatalf("a let-go copy reads %+v", s)
|
||||
}
|
||||
builtOn(t, inv, "b02", "proxy", 2, []string{golang}, golang)
|
||||
if s := stateOf(t, inv, golang); s.State != ArtifactKept || !slices.Equal(s.Why, []string{KeptStoodOn}) {
|
||||
t.Fatalf("a copy copied again reads %+v; want kept again", s)
|
||||
}
|
||||
// A person's record never undoes a collection: only a build that copied it says it is there.
|
||||
if err := inv.MarkCollected(ctx, []string{golang}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := inv.RecordMirrored(ctx, "", "again", []string{golang}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if s := stateOf(t, inv, golang); s.State != ArtifactCollected {
|
||||
t.Fatalf("a person's record brought a collected copy back: %+v", s)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user