g14's Go builder sat idle at capacity 2 because nothing woke its parked puller. mesh-build-go, mesh-build-node and mesh-build-image now pin mesh-sdk b9911dc1, whose puller watches the config value capacity as mesh-config resolved it and wakes on each change, and hand it that watch.
77 lines
2.9 KiB
Go
77 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
|
|
stdio "git.novox.be/novox/mesh-sdk/go"
|
|
"git.novox.be/novox/mesh-sdk/go/buildstep"
|
|
"git.novox.be/novox/mesh-sdk/go/delivery"
|
|
)
|
|
|
|
// **The module pulls its seat's asks** (novox/hq ADR 0525 §2-§6, ADR 0536 §4; issue 1887 A3node), as mesh-build-go
|
|
// does: the seat node-build-node, delivery first, then check, then recheck, at most the node's build capacity at once
|
|
// (its setting `capacity`); each ask runs with the step bodies its tools run, behind the same guard, and ends on the key
|
|
// <node>.<ask id>. The tools stay as the hand path (ADR 0525 §8).
|
|
|
|
// Seat is the node seat this module holds.
|
|
const Seat = "node-build-node"
|
|
|
|
func (m *Module) askSteps(steps []StepTool) buildstep.AskSteps {
|
|
byName := map[string]buildstep.StepFunc{}
|
|
for _, s := range steps {
|
|
run := s.Run
|
|
byName[s.Name] = func(ctx context.Context, args map[string]any) (any, error) {
|
|
defer m.holdArg(args)()
|
|
return run(ctx, args)
|
|
}
|
|
}
|
|
return buildstep.AskSteps{
|
|
Fetch: byName["build_node_fetch"], Build: byName["build_node_build"], Test: byName["build_node_test"],
|
|
Toolchain: func(ctx context.Context) (delivery.ToolchainUsed, error) {
|
|
installed, err := m.Probe(ctx)
|
|
if err != nil {
|
|
return delivery.ToolchainUsed{}, err
|
|
}
|
|
return delivery.ToolchainUsed{Version: installed, Recipe: m.recipe().Version()}, nil
|
|
},
|
|
Release: func(ws string) error { return m.spaces().Release(ws) },
|
|
Logf: m.Say,
|
|
}
|
|
}
|
|
|
|
// Puller is the module's pull of its seat's asks, on source (the runtime's seat pull when nil).
|
|
func (m *Module) Puller(steps []StepTool, source buildstep.AskSource) *buildstep.Puller {
|
|
if source == nil {
|
|
source = buildstep.SeatAsks{Language: delivery.AskNode}
|
|
}
|
|
capacity := m.Capacity
|
|
// The capacity's own change wakes the puller (issue 1887): the runtime's watch of the config value as mesh-config
|
|
// resolved it; the settings file is read only when that watch cannot start. A test's Capacity is its own.
|
|
var watch func(string, func(stdio.ProvisionChange) error) error
|
|
if capacity == nil {
|
|
capacity = buildstep.NodeCapacity(m.Settings, buildstep.DefaultCapacities, m.Node, m.Say)
|
|
watch = buildstep.WatchConfigServed
|
|
}
|
|
ask := m.askSteps(steps)
|
|
var load func(string) ([]byte, error)
|
|
if m.ReadSteps.Get != nil {
|
|
load = func(key string) ([]byte, error) { return m.ReadSteps.Get(key) }
|
|
}
|
|
return &buildstep.Puller{Source: source, Language: delivery.AskNode, Node: m.Node, Put: m.Steps, Load: load,
|
|
Capacity: capacity, WatchConfig: watch, Logf: m.Say,
|
|
Run: func(ctx context.Context, a delivery.StepAsk) (any, error) {
|
|
if err := m.Prepare(ctx); err != nil {
|
|
return nil, err
|
|
}
|
|
if err := m.room(); err != nil {
|
|
return nil, err
|
|
}
|
|
return buildstep.RunAsk(ctx, ask, a)
|
|
}}
|
|
}
|
|
|
|
// SeatTools are the seat's verbs on this node (ADR 0525 §10).
|
|
func (m *Module) SeatTools(p *buildstep.Puller) []stdio.Tool {
|
|
return buildstep.SeatTools(Seat, "Node", p)
|
|
}
|