diff --git a/go.mod b/go.mod index 09302453..f4262db9 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/novox/mesh-controller go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261018164924-2b420603fe83 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261018184557-238440d6f8c4 github.com/jackc/pgx/v5 v5.10.0 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 diff --git a/go.sum b/go.sum index 24293698..0886ef4d 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ git.novox.be/novox/mesh-host v0.0.0-20261018171808-9d9e3a46c4f5 h1:E5stfIeCN6uYgA9TCv+4K8JgaURg3zQppvUgJLaDMP4= git.novox.be/novox/mesh-host v0.0.0-20261018171808-9d9e3a46c4f5/go.mod h1:4wyoCr6IIIIarEUuROThWDj7DAvJvIidqMjWcpSnOwE= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261018164924-2b420603fe83 h1:BrHyE3ifFMUQLIza6I/iNlEgdcysB9/Y+1FO6Q9xws8= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261018164924-2b420603fe83/go.mod h1:GFuZUElBZ9A++mxgIKo97aXXo+kV0uJ/UkbhQPPIbrY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261018184557-238440d6f8c4 h1:yYDxFRJoH59kiCoEulD+FBwctyf9CrtKIxlEAsVL39Q= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261018184557-238440d6f8c4/go.mod h1:GFuZUElBZ9A++mxgIKo97aXXo+kV0uJ/UkbhQPPIbrY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/testdata/beside/CAPTURED b/testdata/beside/CAPTURED index 7d0bb872..7ab5eba7 100644 --- a/testdata/beside/CAPTURED +++ b/testdata/beside/CAPTURED @@ -9,7 +9,7 @@ a second place to clean besides the catalogue itself. mesh-catalog e0bc919d4945bb5f13f971f74643a0b714cf45da modules/*/module.json, modules/nats/Dockerfile mesh-host 9d9e3a46c4f5943cfffb413d962ce48b75e2fd39 examples/foundation-first-node.lock -mesh-sdk 2b420603fe835d6b80e2c98080ab3094c6896c50 conformance/events/module-event.json +mesh-sdk 238440d6f8c46a8dd1d829f4313d7b035a6ca847 conformance/events/module-event.json To move them, from this repository's root, with the two repositories checked out beside it: diff --git a/vendor/git.novox.be/novox/mesh-sdk/go/delivery/delivery.go b/vendor/git.novox.be/novox/mesh-sdk/go/delivery/delivery.go index a9abf833..fd109ec1 100644 --- a/vendor/git.novox.be/novox/mesh-sdk/go/delivery/delivery.go +++ b/vendor/git.novox.be/novox/mesh-sdk/go/delivery/delivery.go @@ -35,8 +35,8 @@ import ( // its own node only, and the watchman writes presence and pulse. const ( HaveBucket = "node-engine_have" - PresenceBucket = "mesh-delivery-watchman_presence" - PulseBucket = "mesh-delivery-watchman_pulse" + PresenceBucket = WatchmanModule + "_presence" + PulseBucket = WatchmanModule + "_pulse" ) // HaveHistory and PresenceHistory are the revisions the have and presence buckets keep per key (research 063 diff --git a/vendor/git.novox.be/novox/mesh-sdk/go/delivery/stuck.go b/vendor/git.novox.be/novox/mesh-sdk/go/delivery/stuck.go new file mode 100644 index 00000000..2de3c46e --- /dev/null +++ b/vendor/git.novox.be/novox/mesh-sdk/go/delivery/stuck.go @@ -0,0 +1,65 @@ +package delivery + +import ( + "encoding/json" + "fmt" + "time" +) + +// WatchmanModule is the watchman's module: its buckets are its own state, `_`, and the controller's +// broker grants it alone the bus's connect and disconnect events (novox/hq ADR 0431). +const WatchmanModule = "mesh-delivery-watchman" + +// StuckBucket holds what stopped moving (novox/hq ADR 0433 ยง2): one key per key whose pulse expired, written by the +// watchman, read by the controller's self-check, which raises each as a condition until it says moved. No key of it +// is removed: a key that moves again is written as moved. +const StuckBucket = WatchmanModule + "_stuck" + +// StuckKey is the key, in StuckBucket, of the key that stopped moving: `.`, formed as PulseKey forms a +// pulse's, so a node or part gone offline is `mesh-delivery-watchman_presence.`. +func StuckKey(bucket, key string) (string, error) { + stuck, err := PulseKey(bucket, key) + if err != nil { + return "", fmt.Errorf("delivery: no stuck key: %w", err) + } + return stuck, nil +} + +// ParseStuckKey is the inverse of StuckKey, splitting at the first dot. +func ParseStuckKey(stuckKey string) (bucket, key string, err error) { + bucket, key, err = ParsePulseKey(stuckKey) + if err != nil { + return "", "", fmt.Errorf("delivery: %q is not a stuck key: %w", stuckKey, err) + } + return bucket, key, nil +} + +// Stuck is the value of a stuck key: the key that stopped moving, what it waited for in words, since when, and +// whether it has moved again since. The watchman writes it; the controller reads it. +type Stuck struct { + V int `json:"v"` + Bucket string `json:"bucket"` + Key string `json:"key"` + Waited string `json:"waited,omitempty"` + Since time.Time `json:"since"` + Moved bool `json:"moved,omitempty"` +} + +// EncodeStuck is s as JSON at Version. +func EncodeStuck(s Stuck) ([]byte, error) { + s.V = Version + return json.Marshal(s) +} + +// DecodeStuck reads a stuck value; it refuses an unknown version (ErrUnknownVersion). +func DecodeStuck(data []byte) (Stuck, error) { + var s Stuck + err := decode(data, &s) + return s, err +} + +// SameStuck says whether two stuck values are the same, so a writer writes only when they differ. +func SameStuck(a, b Stuck) bool { + return a.V == b.V && a.Bucket == b.Bucket && a.Key == b.Key && a.Waited == b.Waited && a.Since.Equal(b.Since) && + a.Moved == b.Moved +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 62e347fd..da1527b8 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,4 +1,4 @@ -# git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261018164924-2b420603fe83 +# git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261018184557-238440d6f8c4 ## explicit; go 1.22 git.novox.be/novox/mesh-sdk/go/asks git.novox.be/novox/mesh-sdk/go/delivery