Skip to content

AshReplicant 1.5.0 — plugin decoders admitted: PostgreSQL 9.6 and 12

Choose a tag to compare

@palermo-git palermo-git released this 02 Oct 00:00
· 23 commits to main since this release

AshReplicant 1.5.0

Added

  • 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.