persist: global commit ordering across streams + 11 tests
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 46s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 46s
global.sx: persist/gappend records a pointer in a reserved $global index whose seq is the global commit position; read-global/project-global replay every event in commit order; global-from for incremental consumers. Opt-in (plain append untouched); $-prefixed streams now reserved + hidden from the public catalog (streams-all reveals them). Gives feed its unified timeline. Deterministic across restart. 191/191. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
123
lib/persist/tests/global.sx
Normal file
123
lib/persist/tests/global.sx
Normal file
@@ -0,0 +1,123 @@
|
||||
; Extension — global commit ordering across streams.
|
||||
|
||||
(persist-test
|
||||
"gappend returns the stream event with its local seq"
|
||||
(let
|
||||
((b (persist/open)))
|
||||
(persist/event-seq
|
||||
(persist/gappend b "orders" "placed" 0 {})))
|
||||
1)
|
||||
(persist-test
|
||||
"global-pos advances per gappend regardless of stream"
|
||||
(let
|
||||
((b (persist/open)))
|
||||
(begin
|
||||
(persist/gappend b "orders" "placed" 0 {})
|
||||
(persist/gappend b "users" "joined" 0 {})
|
||||
(persist/gappend b "orders" "placed" 0 {})
|
||||
(persist/global-pos b)))
|
||||
3)
|
||||
(persist-test
|
||||
"read-global returns events in commit order across streams"
|
||||
(let
|
||||
((b (persist/open)))
|
||||
(begin
|
||||
(persist/gappend b "orders" "placed" 0 {:n 1})
|
||||
(persist/gappend b "users" "joined" 0 {:n 2})
|
||||
(persist/gappend b "orders" "placed" 0 {:n 3})
|
||||
(let
|
||||
((g (persist/read-global b)))
|
||||
(list
|
||||
(get (persist/event-data (nth g 0)) :n)
|
||||
(get (persist/event-data (nth g 1)) :n)
|
||||
(get (persist/event-data (nth g 2)) :n)))))
|
||||
(list 1 2 3))
|
||||
(persist-test
|
||||
"read-global resolves to the right streams"
|
||||
(let
|
||||
((b (persist/open)))
|
||||
(begin
|
||||
(persist/gappend b "orders" "placed" 0 {})
|
||||
(persist/gappend b "users" "joined" 0 {})
|
||||
(let
|
||||
((g (persist/read-global b)))
|
||||
(list
|
||||
(persist/event-stream (nth g 0))
|
||||
(persist/event-stream (nth g 1))))))
|
||||
(list "orders" "users"))
|
||||
(persist-test
|
||||
"project-global folds across all streams in order"
|
||||
(let
|
||||
((b (persist/open)))
|
||||
(begin
|
||||
(persist/gappend b "a" "x" 0 {:v 10})
|
||||
(persist/gappend b "b" "x" 0 {:v 20})
|
||||
(persist/gappend b "a" "x" 0 {:v 30})
|
||||
(persist/project-global
|
||||
b
|
||||
(fn (acc e) (+ acc (get (persist/event-data e) :v)))
|
||||
0)))
|
||||
60)
|
||||
(persist-test
|
||||
"global index is hidden from the public catalog"
|
||||
(let
|
||||
((b (persist/open)))
|
||||
(begin
|
||||
(persist/gappend b "orders" "placed" 0 {})
|
||||
(persist/gappend b "users" "joined" 0 {})
|
||||
(list (persist/stream-count b) (persist/stream-exists? b "$global"))))
|
||||
(list 2 false))
|
||||
(persist-test
|
||||
"streams-all reveals the reserved index"
|
||||
(let
|
||||
((b (persist/open)))
|
||||
(begin
|
||||
(persist/gappend b "orders" "placed" 0 {})
|
||||
(contains? (persist/streams-all b) "$global")))
|
||||
true)
|
||||
(persist-test
|
||||
"global-from gives pointers at or after a position"
|
||||
(let
|
||||
((b (persist/open)))
|
||||
(begin
|
||||
(persist/gappend b "a" "x" 0 {})
|
||||
(persist/gappend b "a" "x" 0 {})
|
||||
(persist/gappend b "a" "x" 0 {})
|
||||
(len (persist/global-from b 2))))
|
||||
2)
|
||||
(persist-test
|
||||
"plain append does not touch the global index"
|
||||
(let
|
||||
((b (persist/open)))
|
||||
(begin
|
||||
(persist/append b "orders" "placed" 0 {})
|
||||
(persist/gappend b "orders" "placed" 0 {})
|
||||
(persist/global-pos b)))
|
||||
1)
|
||||
(persist-test
|
||||
"global ordering works on the durable backend"
|
||||
(let
|
||||
((db (persist/mock-durable (persist/mem-backend))))
|
||||
(begin
|
||||
(persist/gappend db "a" "x" 0 {:v 1})
|
||||
(persist/gappend db "b" "x" 0 {:v 2})
|
||||
(persist/project-global
|
||||
db
|
||||
(fn (acc e) (+ acc (get (persist/event-data e) :v)))
|
||||
0)))
|
||||
3)
|
||||
(persist-test
|
||||
"global order survives restart (determinism)"
|
||||
(let
|
||||
((disk (persist/mem-backend)))
|
||||
(begin
|
||||
(let
|
||||
((db (persist/mock-durable disk)))
|
||||
(begin
|
||||
(persist/gappend db "a" "x" 0 {:v 1})
|
||||
(persist/gappend db "b" "x" 0 {:v 2})))
|
||||
(persist/project-global
|
||||
(persist/mock-durable disk)
|
||||
(fn (acc e) (+ acc (get (persist/event-data e) :v)))
|
||||
0)))
|
||||
3)
|
||||
Reference in New Issue
Block a user