Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
daa1fd3
feat(cdc): native SQLite CDC source (db.cdc.sqlite)
skhaz Jun 16, 2026
29ee80a
refactor(sql): decompose engines into a self-registering registry
skhaz Jun 18, 2026
2a54699
Merge remote-tracking branch 'origin/main' into feat/sqlite-cdc
wolfy-j Jul 6, 2026
8c88237
fix(cdc): honest live-observation semantics for db.cdc.sqlite
skhaz Jul 15, 2026
ddf2b50
test(cdc): unit helpers + multi-subscriber, multi-table & no-gap conc…
skhaz Jul 15, 2026
4083c2d
Merge remote-tracking branch 'origin/main' into feat/sqlite-cdc
wolfy-j Aug 9, 2026
f40446b
feat(cdc): add driver-neutral source registry and manager
wolfy-j Aug 9, 2026
d0347bd
fix(cdc): bind subscriptions to dispatcher lifecycle
wolfy-j Aug 9, 2026
6cf614c
fix(lua): harden CDC stream options
wolfy-j Aug 9, 2026
ee19ea5
fix(cdc/postgres): harden source capabilities and subscriptions
wolfy-j Aug 9, 2026
ca2732b
fix(cdc): enforce source lifecycle and stream contracts
wolfy-j Aug 9, 2026
7cdd57c
fix(cdc/postgres): clean fresh slots and reconcile publications
wolfy-j Aug 9, 2026
0897344
fix(cdc): guard replacement resources and exclusive leases
wolfy-j Aug 9, 2026
7189fc6
fix(cdc/postgres): enforce replication slot names
wolfy-j Aug 9, 2026
2b60a96
fix(cdc/postgres): finalize bounded transactional delivery
wolfy-j Aug 9, 2026
99b1ddc
fix(cdc/sqlite): close snapshot streams on worker exit
wolfy-j Aug 9, 2026
25a8fcf
refactor(sql): own SQLite mutation observation per pool
wolfy-j Aug 9, 2026
0a4a6b8
fix(lua): align CDC registry test fields
wolfy-j Aug 9, 2026
ed54fbd
chore(cdc/sqlite): clean up lint findings
wolfy-j Aug 9, 2026
1e967f0
fix(cdc): align generic CDC structs
wolfy-j Aug 9, 2026
aca095f
fix(cdc/postgres): satisfy lifecycle and layout lint
wolfy-j Aug 9, 2026
db5cb26
chore(sql): satisfy observer lint contracts
wolfy-j Aug 9, 2026
1aa488b
fix(cdc/sqlite): own snapshot acquisition lifecycle
wolfy-j Aug 9, 2026
f4ca3b1
fix(cdc): make dispatcher admission and relay delivery cancellable
wolfy-j Aug 9, 2026
676ff3d
fix(relay): reject uncancellable context delivery
wolfy-j Aug 9, 2026
38317fc
fix(sqlite): bound observer relay and pool usage
wolfy-j Aug 9, 2026
7e5e817
fix(cdc/postgres): bound interleaved transactions and subscriptions
wolfy-j Aug 9, 2026
6be8d0c
fix(cdc/postgres): bound subscriber queues to stream capacity
wolfy-j Aug 9, 2026
94cce6d
fix(cdc/postgres): close subscriber streams synchronously
wolfy-j Aug 9, 2026
c1bfdfd
fix(cdc): make source replacement lifecycle transactional
wolfy-j Aug 9, 2026
204da0a
fix(cdc): retain failed candidate cleanup leases
wolfy-j Aug 9, 2026
23c07b4
fix(cdc/sqlite): make stop retries lifecycle-safe
wolfy-j Aug 9, 2026
e2eeada
fix(supervisor): cancel active starts with run context
wolfy-j Aug 9, 2026
1f3031a
fix(sqlite): bound snapshot batches before emission
wolfy-j Aug 9, 2026
2118b01
feat(cdc): bound driver subscriber memory
wolfy-j Aug 9, 2026
05eed6a
perf(cdc): estimate fanout payload once
wolfy-j Aug 9, 2026
d1e53d6
fix(cdc/postgres): await failed run shutdown
wolfy-j Aug 9, 2026
d7c52e0
fix(cdc): retain startup snapshot subscriptions
wolfy-j Aug 9, 2026
06b19d4
fix(cdc): bound retained messages across scheduler and Lua
wolfy-j Aug 9, 2026
3d3ddb3
chore(cdc): align bounded queue state
wolfy-j Aug 9, 2026
a3edf64
fix(lua): retain bounded CDC delivery invariants
wolfy-j Aug 9, 2026
a01b566
fix(cdc): transfer queue retention ownership
wolfy-j Aug 9, 2026
3435eb2
fix(relay): route cancellable local deliveries
wolfy-j Aug 9, 2026
c3e085e
fix(lua): preserve completed mailbox visibility
wolfy-j Aug 9, 2026
e977a24
test(lua): preserve mailbox semantics across completion
wolfy-j Aug 9, 2026
32f36d6
fix(relay): linearize mailbox receiver generations
wolfy-j Aug 9, 2026
2160500
fix(cdc/postgres): make snapshots per-subscriber
wolfy-j Aug 9, 2026
0aac945
fix(cdc/postgres): join snapshot workers safely
wolfy-j Aug 9, 2026
52d700e
fix(cdc/postgres): isolate generation subscriber cleanup
wolfy-j Aug 9, 2026
ac33578
Merge remote-tracking branch 'origin/main' into feat/sqlite-cdc
wolfy-j Aug 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions .github/workflows/ci-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -86,3 +86,29 @@ jobs:
SKIP_CLOUDSTORAGE_TESTS: "1"
SKIP_DOCKER_TESTS: "1"
run: make test

test-sqlite-cdc:
name: Test SQLite CDC (Linux, CGO, race)
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Check out code
uses: actions/checkout@v7

- name: Set up Go
uses: actions/setup-go@v7
with:
go-version: '1.26.5'
cache: true

- name: Install dependencies
run: go mod download

- name: Run tagged SQLite CDC tests
env:
CGO_ENABLED: 1
GORACE: "halt_on_error=1"
SKIP_TEMPORAL_TESTS: "1"
SKIP_CLOUDSTORAGE_TESTS: "1"
SKIP_DOCKER_TESTS: "1"
run: make test-cdc-sqlite
30 changes: 19 additions & 11 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,17 @@ test:
go test ./system/... -v -race -short
go test ./service/... -v -race -short
go test ./cluster/... -v -race -short
go test --tags "fts5 sqlite_vec treesitter" ./runtime/... -v -race -short
go test --tags "fts5 sqlite_vec treesitter sqlite_preupdate_hook" ./runtime/... -v -race -short
go test ./boot/... -v -race -short
go test --tags "fts5 sqlite_vec treesitter" ./cmd/... -v -race -short
go test --tags "fts5 sqlite_vec treesitter sqlite_preupdate_hook" ./cmd/... -v -race -short

# The default service test intentionally stays untagged so the SQLite stub and
# the non-CGO portability path remain covered. The real preupdate-hook source
# is exercised by the Linux CGO CI job through this target.
.PHONY: test-cdc-sqlite
test-cdc-sqlite:
CGO_ENABLED=1 go test ./service/sql/... ./service/cdc/sqlite -v -race -tags sqlite_preupdate_hook
CGO_ENABLED=1 go test ./service/cdc/sqlite -v -race -timeout 300s -tags "integration sqlite_preupdate_hook"

test-system:
go test ./internal/... -v -race
Expand All @@ -25,7 +33,7 @@ test-system:
test-runtime:
go test ./internal/... -v -race
go test ./api/... -v -race
go test --tags "fts5 sqlite_vec treesitter" ./runtime/... -v -race
go test --tags "fts5 sqlite_vec treesitter sqlite_preupdate_hook" ./runtime/... -v -race

test-service:
go test ./internal/... -v -race
Expand All @@ -45,7 +53,7 @@ test-network:

.PHONY: lint
lint:
go run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.8.0 run --timeout=10m --build-tags=race ./...
go run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.8.0 run --timeout=10m --build-tags=race,sqlite_preupdate_hook ./...

# Mutation testing with gremlins. Coverage is scoped to the directory gremlins
# runs from, so target a package subtree via MUTATE_DIR. workers=1 keeps per-
Expand Down Expand Up @@ -92,7 +100,7 @@ build-wippy: build-wippy-local
.PHONY: build-wippy-local
build-wippy-local:
mkdir -p ./dist
CGO_ENABLED=1 go build --tags "fts5 sqlite_vec treesitter" \
CGO_ENABLED=1 go build --tags "fts5 sqlite_vec treesitter sqlite_preupdate_hook" \
-ldflags="$(WIPPY_LDFLAGS)" \
-trimpath \
-o ./dist/wippy-$(shell go env GOOS)-$(shell go env GOARCH) \
Expand All @@ -104,7 +112,7 @@ build-wippy-all: build-wippy-linux-amd64 build-wippy-linux-arm64 build-wippy-dar
.PHONY: build-wippy-linux-amd64
build-wippy-linux-amd64:
mkdir -p ./dist
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build --tags "fts5 sqlite_vec treesitter" \
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build --tags "fts5 sqlite_vec treesitter sqlite_preupdate_hook" \
-ldflags="$(WIPPY_LDFLAGS)" \
-trimpath \
-o ./dist/wippy-linux-amd64 \
Expand All @@ -114,7 +122,7 @@ build-wippy-linux-amd64:
build-wippy-linux-arm64:
mkdir -p ./dist
CGO_LDFLAGS="" CGO_CFLAGS="" CC=aarch64-linux-gnu-gcc \
CGO_ENABLED=1 GOOS=linux GOARCH=arm64 go build --tags "fts5 sqlite_vec treesitter" \
CGO_ENABLED=1 GOOS=linux GOARCH=arm64 go build --tags "fts5 sqlite_vec treesitter sqlite_preupdate_hook" \
-ldflags="$(WIPPY_LDFLAGS)" \
-trimpath \
-o ./dist/wippy-linux-arm64 \
Expand All @@ -123,7 +131,7 @@ build-wippy-linux-arm64:
.PHONY: build-wippy-darwin-amd64
build-wippy-darwin-amd64:
mkdir -p ./dist
CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 go build --tags "fts5 sqlite_vec treesitter" \
CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 go build --tags "fts5 sqlite_vec treesitter sqlite_preupdate_hook" \
-ldflags="$(WIPPY_LDFLAGS)" \
-trimpath \
-o ./dist/wippy-darwin-amd64 \
Expand All @@ -132,7 +140,7 @@ build-wippy-darwin-amd64:
.PHONY: build-wippy-darwin-arm64
build-wippy-darwin-arm64:
mkdir -p ./dist
CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 go build --tags "fts5 sqlite_vec treesitter" \
CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 go build --tags "fts5 sqlite_vec treesitter sqlite_preupdate_hook" \
-ldflags="$(WIPPY_LDFLAGS)" \
-trimpath \
-o ./dist/wippy-darwin-arm64 \
Expand All @@ -142,7 +150,7 @@ build-wippy-darwin-arm64:
build-wippy-windows-amd64:
mkdir -p ./dist
CGO_LDFLAGS="" CGO_CFLAGS="" CC=x86_64-w64-mingw32-gcc \
CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build --tags "fts5 sqlite_vec treesitter" \
CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build --tags "fts5 sqlite_vec treesitter sqlite_preupdate_hook" \
-ldflags="$(WIPPY_LDFLAGS)" \
-trimpath \
-o ./dist/wippy-windows-amd64.exe \
Expand Down Expand Up @@ -175,4 +183,4 @@ build-sign-wippy-windows: build-wippy-windows-amd64 sign-wippy-windows

.PHONY: run-wippy
run-wippy:
go run --tags "fts5 sqlite_vec treesitter" -ldflags="$(WIPPY_LDFLAGS)" ./cmd/wippy/ $(ARGS)
go run --tags "fts5 sqlite_vec treesitter sqlite_preupdate_hook" -ldflags="$(WIPPY_LDFLAGS)" ./cmd/wippy/ $(ARGS)
6 changes: 6 additions & 0 deletions api/process/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ var (
ErrProcessNotIdle = apierror.New(InvalidState, "process is not idle").WithRetryable(apierror.False)

ErrSchedulerStopping = apierror.New(InvalidState, "scheduler is stopping").WithRetryable(apierror.False)

// ErrMessageQueueOverflow is delivered as a terminal stream error when an
// explicitly bounded message subscription exhausts its retained backlog.
// It is intentionally an ordinary Go sentinel so consumers can use
// errors.Is on the error carried by the terminal payload.
ErrMessageQueueOverflow = errors.New("message queue limit exceeded")
)

// ErrProcessReplacementRequested is an internal scheduler sentinel. A process
Expand Down
Loading