Compare a build with the one the mesh registered, not the newest, which may be one put back (review of #336, hq issue 721)
mesh/merge-gate head 38c87a7e4714 merged into trunk c2ec0a601acb — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
mesh/repo-check head 38c87a7e4714 merged into trunk c2ec0a601acb — fail: its merge-check.sh failed: --- FAIL: TestAWalkWhoseEveryBuildCameOutTheSameIsDone …
mesh/delivery-group group fix/a-module-moves-only-when-its-program-changes rejected: a member's own check failed
mesh/delivery superseded: a newer head of the same pull request
mesh/merge-gate head 38c87a7e4714 merged into trunk c2ec0a601acb — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
mesh/repo-check head 38c87a7e4714 merged into trunk c2ec0a601acb — fail: its merge-check.sh failed: --- FAIL: TestAWalkWhoseEveryBuildCameOutTheSameIsDone …
mesh/delivery-group group fix/a-module-moves-only-when-its-program-changes rejected: a member's own check failed
mesh/delivery superseded: a newer head of the same pull request
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/jackc/pgx/v5"
|
||||
@@ -301,6 +302,51 @@ func (i *Inventory) Held(ctx context.Context) (map[string]string, error) {
|
||||
return held, nil
|
||||
}
|
||||
|
||||
// RegisteredHeld is Held narrowed to the build each module has registered (novox/hq issue 721): an artifact is kept
|
||||
// only when its reference's digest is in the manifest the module table holds for it, which is what its machines are
|
||||
// sent. After a gate failed and the mesh put the earlier build back (RestoreModule), the newest successful build is
|
||||
// not what runs, and its artifacts are left out here, so nothing is compared with them.
|
||||
func (i *Inventory) RegisteredHeld(ctx context.Context) (map[string]string, error) {
|
||||
held, err := i.Held(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
rows, err := i.store.Pool().Query(ctx, `select name, coalesce(manifest::text, '') from module`)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
registered := map[string]string{}
|
||||
for rows.Next() {
|
||||
var name, manifest string
|
||||
if err := rows.Scan(&name, &manifest); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
registered[name] = manifest
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return registeredOnly(held, registered), nil
|
||||
}
|
||||
|
||||
// registeredOnly keeps of held each "<module>/<artifact>" whose reference's digest the module's registered manifest
|
||||
// names.
|
||||
func registeredOnly(held, registered map[string]string) map[string]string {
|
||||
out := map[string]string{}
|
||||
for key, ref := range held {
|
||||
module, _, ok := strings.Cut(key, "/")
|
||||
at := strings.LastIndex(ref, "@")
|
||||
if !ok || at < 0 || len(ref) <= at+1 {
|
||||
continue
|
||||
}
|
||||
if strings.Contains(registered[module], ref[at+1:]) {
|
||||
out[key] = ref
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// BuiltAgainst is what each module's newest successful build stood on, as recorded — the build
|
||||
// edges (ADR 0009). A module whose last build recorded no bases is absent, which is also what a
|
||||
// module standing on nothing looks like: an edge the mesh has not derived is not an edge.
|
||||
|
||||
Reference in New Issue
Block a user