Repository navigation
v0.32.1
Upgrading from 0.32.0 — read these first:
-
No state migration. The state schema stays v37; 0.32.0 and 0.32.1 open each other's state.
-
New refusals (exit 5) where 0.32.0 went on or failed generically:
- a MySQL session still off UTC after rivet's
SET time_zone(a proxy dropped it):
RIVET_SOURCE_SESSION_TIME_ZONE_NOT_APPLIED, before any row is read; - a remote PostgreSQL
RIVET_STATE_URLwithoutsslmode:RIVET_STATE_URL_TLS_REQUIRED
(add?sslmode=require, or?sslmode=disableon a private network); rivet checkthat logged an ERROR:RIVET_CLI_CHECK_REPORTED_ERRORSinstead ofLooks good.;rivet initwith aRIVET_STATE_URLthat does not answer writes no config.
- a MySQL session still off UTC after rivet's
-
rivet initnames a CDC export<table>_cdcwith a sibling prefix (new configs only; an
existing config is read as before). -
A state write beside a sibling writer in the same process could fail
database is locked.
SQLite's busy wait has no queue: a writer that committed back to back (chunk workers, the lease
keeper, a run's own store on one SQLite state file) took the lock in every gap, and the other
store'sBEGIN IMMEDIATEwas refused after 15 s, past the 10 s busy timeout (0.32.0 and
earlier; seen as a 1-in-1000 CI failure of a replan beside a writer). Now writers of one
state file in one process take turns at its write lock, first come first served; another
process still meets SQLite's busy wait. What to do: nothing. -
A MySQL source behind a proxy that dropped
SET time_zonedelivered every TIMESTAMP shifted
by the server's offset, exit 0. rivet reads MySQL in a UTC session; a ProxySQL that answered
the SET without forwarding it left the read at the server's zone (a pilot's Europe/Moscow:
12:00:00Zwritten for09:00:00Z) (0.32.0 and earlier). Now rivet checks on the
connection that reads, before the first row, that the session is at UTC, and refuses
RIVET_SOURCE_SESSION_TIME_ZONE_NOT_APPLIED, exit 5, naming the offset otherwise. What to
do: setdefault_time_zone = '+00:00'on the server, keep rivet's session variables on one
backend in the proxy, or connect directly; re-export what a proxied run delivered before. -
A
skippedentry of the run summary did not say why it was skipped.--summary-output
and--jsonofrivet run/rivet applywrotestatus: "skipped"for askip_emptyrun
with no reason, while the console card and the metrics row had it (0.32.0 and earlier).
Now everyper_export[]entry carriesskip_reason: the reason for askippedentry ("no
new rows since cursor 'updated_at'", "source returned 0 rows"),nullfor every other, on the
sequential, thread and process runners. What to do: nothing; a scheduler may read it. -
rivet initgave a table's batch and CDC exports one name and nested the CDC prefix in the
batch one. Both scaffolds named the export after the table, and the CDC one wrote
exports/<t>/cdc/insideexports/<t>/(./output/<t>/cdc/locally), so the two exports shared
a load spec in a shared state and a load of the batch prefix listed the stream's runs (0.32.0
and earlier). Now a CDC scaffold names its export<t>_cdcand writes to the sibling
exports/<t>_cdc/(./output/<t>_cdc/). What to do: nothing for new scaffolds; a config
generated earlier keeps working, andrivet loadalready skips a nested CDC export's runs. -
A schema-wide
rivet initon SQL Server scaffolded the system tables SQL Server ships. On a
database with CDC enableddbo.systranschemasbecame an export (0.32.0 and earlier). Now
tables and views markedIsMSShippedare left out. What to do: delete such an export from a
config generated earlier. -
A SQL Server login without
VIEW SERVER PERFORMANCE STATEfilled the log with permission
errors. Each run sampled the server counters (sys.dm_os_performance_countersand the wait
and query statistics) and the driver logged the server's refusal at ERROR, twice per run, on a
run that otherwise succeeded (0.32.0 and earlier). Now rivet asks once per connection
whether the login may read them and skips them quietly when it may not. What to do:
nothing; grantVIEW SERVER PERFORMANCE STATE(2022) orVIEW SERVER STATEto keep the
harm counters and the governor's pressure signal. -
The rollback steps left the previous release refusing every table the newer release
created. After putting the state copy back, a warehouse table first loaded after the upgrade
has no row in the restored load ledger, so the previous release'srivet loadrefused it on
every cycle ("no record of rivet loading it", exit 1), anddocs/reference/state.mddid not say
so (0.32.0). Now the rollback steps list those tables (rivet state loadsbefore and after
the restore) and drop them, and the previous release's next load lands them again from the runs
still staged. What to do: when rolling back, follow steps 2, 4 and 5 of "Rolling back an
upgrade". -
rivet init,rivet checkandrivet doctorwere green over a state no run could open.
WithRIVET_STATE_URLpointing at a state that does not answer,initwarned "primary keys
not recorded" and wrote the config, exit 0;checkprintedLooks good., exit 0;doctor
did not look at the state at all, so setup passed and every run after it failed (0.32.0 and
earlier). Nowdoctoropens the state the config uses without migrating it and prints
[OK] State (postgres …)/(sqlite …)or fails;checkexits non-zero
(RIVET_CLI_CHECK_REPORTED_ERRORS) when it logged an ERROR line, including a state that does not
answer;init -owithRIVET_STATE_URLset refuses before writing the config when that state
does not answer. What to do: nothing; fix what the new failure names. -
rivet --versionprinted(unknown)instead of the commit on the glibc 2.28 Linux assets.
The container that builds them checked the tree out without.git, so the build could not read
the commit (0.32.0). Now they printrivet <version> (<commit>)like every other asset, and
the release refuses to publish one that does not. What to do: nothing. -
A PostgreSQL state on a remote host without TLS could not be used at all. Every command
withRIVET_STATE_URLnaming a non-loopback host was refusedRIVET_STATE_BACKEND_FAILED,
exit 1, with a text that told the operator to addsource.tls, a key the state does not
have, and even?sslmode=disablewas refused (0.32.0 and earlier). Now?sslmode=disable
is honoured as the operator's opt-out with one warning line, and a remote URL that names no
sslmodeis refusedRIVET_STATE_URL_TLS_REQUIRED, exit 5, naming the two state remedies.
What to do: add?sslmode=requiretoRIVET_STATE_URLwith TLS on the state server, or
?sslmode=disableon a private network. -
A batch
rivet loadread the runs of a CDC export nested inside its prefix.rivet init
puts a table's CDC export atexports/<t>/cdc/inside its batch exportexports/<t>/, under
the same export name, and the load lists its prefix recursively: the batch table received the
stream's change rows, so a row deleted at the source stayed in it (a full load landed 7 rows
for 5, an incremental one kept the deleted key), exit 0 (0.32.0 and earlier). Now a full or
incremental load skips the CDC runs of its export that sit in a sub-directory holding none of
its batch runs, and says in one line which directories it skipped; the CDC export's own load
still loads them. What to do: nothing; reload a batch table that was loaded from such a
prefix (mode: fullreplaces it on the next load).