Repository navigation
v0.35.0
Requires vgi-rpc 0.47.0.
Table-in-out state is kept per substream, not per process
A table-in-out function's accumulated state is stored in execution-scoped storage and handed to finish() at finalize. It was keyed by the worker's process id. That key is only unique when every connection is its own process, but the Python client fans one execution across several connections, and a launched, TCP or HTTP worker serves them all from one process. The connections overwrote each other's state and finish() undercounted (substream_partial_sum returned 194850 for 1999000).
The state is now keyed by InitRequest.substream_id, the client-minted id the DuckDB extension already sends for every substream. The Python client now mints one per connection it fans out to. A client that sends no substream_id is keyed by process id, exactly as before.
Client("launch:<argv>")
A worker string of the form launch:<argv> selects the launch transport, with the argv split shlex-style. It is the same scheme as the DuckDB extension's launch: LOCATION, so one string names the same shared worker in both clients.
In-memory storage no longer fails with "database table is locked"
The shared-cache :memory: store (what vgi-fixture-http uses) serialized only its writers, so concurrent readers failed with sqlite3.OperationalError: database table is locked. Every storage operation is now serialized, and the store's lazy resolution is locked.
vgi-serve: the introspection rate limit is gone
vgi-rpc 0.47 no longer throttles introspect_token, so vgi-serve drops --introspect-rate-limit and its environment variable. Remove the flag from any deployment that passes it.
Tests
The suite now reaches its fixture workers through the launcher by default: one shared worker per command instead of a pool per xdist process. VGI_TEST_CLIENT_TRANSPORT=subprocess restores the old behavior, and Windows uses it automatically.