diff --git a/modules/mesh-delivery-view/go.mod b/modules/mesh-delivery-view/go.mod index 83919b8..6f830d0 100644 --- a/modules/mesh-delivery-view/go.mod +++ b/modules/mesh-delivery-view/go.mod @@ -3,7 +3,7 @@ module mesh-delivery-view go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261018170604-f692fe7da89d + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261018184557-238440d6f8c4 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 ) diff --git a/modules/mesh-delivery-view/go.sum b/modules/mesh-delivery-view/go.sum index b43f1eb..cf28001 100644 --- a/modules/mesh-delivery-view/go.sum +++ b/modules/mesh-delivery-view/go.sum @@ -1,5 +1,5 @@ -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261018170604-f692fe7da89d h1:Z2Imj5fpGsd4m71woA6DD+IhD6dYnwVKjWfmBCJHbYQ= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261018170604-f692fe7da89d/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/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= diff --git a/modules/mesh-delivery-view/vendor/git.novox.be/novox/mesh-sdk/go/delivery/delivery.go b/modules/mesh-delivery-view/vendor/git.novox.be/novox/mesh-sdk/go/delivery/delivery.go index a9abf83..fd109ec 100644 --- a/modules/mesh-delivery-view/vendor/git.novox.be/novox/mesh-sdk/go/delivery/delivery.go +++ b/modules/mesh-delivery-view/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/modules/mesh-delivery-view/vendor/git.novox.be/novox/mesh-sdk/go/delivery/stuck.go b/modules/mesh-delivery-view/vendor/git.novox.be/novox/mesh-sdk/go/delivery/stuck.go new file mode 100644 index 0000000..2de3c46 --- /dev/null +++ b/modules/mesh-delivery-view/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/modules/mesh-delivery-view/vendor/modules.txt b/modules/mesh-delivery-view/vendor/modules.txt index 2b086e5..e5acdca 100644 --- a/modules/mesh-delivery-view/vendor/modules.txt +++ b/modules/mesh-delivery-view/vendor/modules.txt @@ -1,4 +1,4 @@ -# git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261018170604-f692fe7da89d +# git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261018184557-238440d6f8c4 ## explicit; go 1.22 git.novox.be/novox/mesh-sdk/go/delivery # github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op