Serve a module's log verbs so its record outlives a bucket's cap and the events' week (ADR 0297, issues 501, 502)
mesh/delivery superseded: a newer head of the same pull request
mesh/merge-gate pass: builds mesh-tools, node-tools → ace, g14, novox, shanks; no bus step; every machine composes with the change as it did without (4 of …
mesh/repo-check pass: THE CHANGE ALTERS ITS OWN CHECK (merge-check.sh): main's version judged it; the change's judges the pull requests after it merges; it…

The runtime answers mesh/log.append, read, last and info for a log issued
in the module's membership, by publish, batch direct get and stream info
alone. A stale expect is refused as a lost state update, so a module tells
it by the same code.
This commit is contained in:
jochen
2026-10-11 19:18:46 +02:00
parent 336a2b1328
commit d535dd5322
8 changed files with 776 additions and 2 deletions
+29
View File
@@ -231,3 +231,32 @@ func (m *Mesh) Bucket(t *testing.T, name string) nats.KeyValue {
}
return kv
}
// Log makes a module's log afresh as the controller does from the catalogue (novox/hq ADR 0297): a file
// stream named LOG_<module>_<name> on mesh.log.<module>.<name>.>, limits retention, no age, no cap per
// key, the declared cap, 256 KiB an entry, refusing new entries when full, direct get, no delete or
// purge. It answers the membership entry the controller issues for it.
func (m *Mesh) Log(t *testing.T, module, name string, maxBytes int64) bus.LogIssued {
t.Helper()
stream := "LOG_" + module + "_" + name
subject := "mesh.log." + module + "." + name
_ = m.js.DeleteStream(stream)
if _, err := m.js.AddStream(&nats.StreamConfig{Name: stream, Subjects: []string{subject + ".>"},
Storage: nats.FileStorage, Retention: nats.LimitsPolicy, MaxAge: 0, MaxMsgsPerSubject: -1,
MaxBytes: maxBytes, MaxMsgSize: 256 * 1024, Discard: nats.DiscardNew, AllowDirect: true,
DenyDelete: true, DenyPurge: true, Replicas: 1,
Description: module + "'s log " + name + ", kept as its record (novox/hq ADR 0297)"}); err != nil {
t.Fatal(err)
}
return bus.LogIssued{Name: name, Stream: stream, Subject: subject, Writes: true}
}
// Consumers is how many consumers a stream has.
func (m *Mesh) Consumers(t *testing.T, stream string) int {
t.Helper()
info, err := m.js.StreamInfo(stream)
if err != nil {
t.Fatal(err)
}
return info.State.Consumers
}