You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
AshReplicant 1.5.0 — plugin decoders admitted: PostgreSQL 9.6 and 12
All three Replicant 1.4 decoders are admitted: :pgoutput (default,
unchanged), :pglogical (pglogical 2.x), and :wal2json (wal2json ≥ 2.6)
— PostgreSQL 9.6 and 12 sources join the support matrix
(ADR-0026). The five decoder options pass through to Replicant.start_link/1 unchanged, and the table-set key the decoder
names (publication: / replication_sets: / tables:) feeds the
adapter's OWN admission surfaces through one home, AshReplicant.SourceSet:
the source-coverage census is decoder-scoped — the pgoutput pass stays
byte-identical; pglogical's table set is its replication sets' members
(via Replicant's QueryBuilder.replication_set_tables/1), wal2json's is
the configured tables:; columns, primary keys, and replica identity
read through the framework's *_for/1 builders plus a VALUES-joined
adapter variant, every identifier validated;
the durable contract manifest records the decoder-scoped set — a stored
pgoutput manifest is byte-untouched and keeps classifying :equal
(upgrade-in-place); a decoder or table-set switch on an existing
checkpoint halts {:incompatible, :decoder} (an explicit operator
reset decision);
the doctor is decoder-aware — per-decoder release floors (pgoutput from
PostgreSQL 12, the plugin decoders from 9.6), a release-conditional
slot statement (wal_status/safe_wal_size are PG13+; pre-13 probes
read NULL and the WAL-risk classifier answers :unknown, never a
guess), a :source_plugin check that proves pglogical's extension row
and honestly reports wal2json's presence as :plugin_presence_not_provable (no catalog row exists; the transport's
connect probe stays the authority), and per-table privileges for the
plugin paths;
live evidence per major: the decoder-old-majors CI cells build
upstream's commit-pinned plugin substrate (test/support/pg_old.dockerfile)
and run the decoder lanes — pglogical and wal2json mirror
insert/update/delete through the host's own actions, tolerate the
pre-15 empty-transaction suppression (a catalog-touching zero-change
transaction between mirrored writes), and prove effect-once across
stop/resume; PostgreSQL 12 additionally mirrors the pgoutput publication
path, and 9.6 asserts the honest pre-10 pgoutput refusal. A config that
previously carried decoder: :pglogical alongside a publication
SILENTLY RAN pgoutput (the key was dropped); it now runs the decoder it
names, under the adapter's census and contract.
The grammar stays the transport's. A table-set key belonging to
another decoder, a wal2json-only knob under pgoutput, or an unknown
decoder atom surfaces as Replicant's own {:error, :config_invalid};
a capability the chosen decoder cannot express (messages: on pglogical
— relevant because a routed sink auto-starts messages: true; streaming:/failover: off pgoutput) returns {:error, :decoder_capability_unsupported} at start. Replicant's
connect-time decoder halts stay transport-owned: the tombstone carries
the generic :pipeline_terminated and the precise reason rides [:replicant, :connection, :slot_invalidated] telemetry — documented as
the operator's first stop.
Changed
The Replicant requirement floor and lock move to 1.4.0
(>= 1.4.0 and < 2.0.0-0): the decoder option grammar this package
forwards is only real on a 1.4 runtime, and a 1.3.x resolution would
silently drop the forwarded options instead of validating them. On
PostgreSQL 15+ Replicant 1.4's delivery is byte-identical to 1.3.0; its
empty-transaction suppression (pre-15 only) and every-decoder
dropped-column halts are transport-internal. No sink-callback,
checkpoint, or Replicant.Error contract the adapter consumes changed.
The doctor's runtime requirement literals and the exact-floors CI cell
move with the floor (the current-lock, latest-compatible, and
release-contract cells follow the public requirement).
Documentation: the decoder contract is documented end to end — the
admitted options and matrix (usage-rules.md), the decision record
(ADR-0026, indexed; ROADMAP F1 closed), the transport-halt mapping and
the telemetry first-stop pointer (usage-rules.md status section), the
two decoder rows in docs/RECOVERY.md, the production-integration note
in the tour notebook, the scope line and build log in docs/CHARTER.md,
and the supported-foundation block in the README.