Spock Release Notes
Spock 5.0.12
Upgrade Notes
-
There are no schema changes in 5.0.12.
-
PostgreSQL's 2026 security fix for CVE-2026-6471 (back-patched to every supported major) added the
output_plugin_librariesparameter, and a library may no longer be used as an output plugin unless it is listed there. Its default excludesspock_output, so on a server carrying the fix logical decoding fails withlibrary "spock_output" may not be used as an output plugin. The check runs whenever decoding starts, not only at slot creation, so this stops an established cluster after a minor-version upgrade - not just new subscriptions. Setoutput_plugin_libraries = 'pgoutput, test_decoding, spock_output'on every node, physical standbys included, and only on servers that have the parameter -
on older releases an unrecognised parameter stops the server from starting. See Configuring Spock. The regression and TAP test suites and the Docker test image now check for the parameter and set it themselves.
-
When the apply worker fails for a reason that has nothing to do with the data (a deadlock, a lock timeout, a provider that is restarting), it now restarts and tries again instead of treating the failure as an exception. See Bug Fixes. If the problem never goes away, you will see the apply worker restart every
spock.restart_delay_default(5 seconds by default) rather than a disabled subscription or a discarded transaction.
Bug Fixes
-
The apply worker now retries after temporary errors. Some errors have nothing to do with the replicated data: PostgreSQL picked the apply worker as a deadlock victim,
lock_timeoutfired, the server briefly ran out of a resource (SQLSTATE class 53), or the provider was restarting or still in recovery (57P02, 57P03). All of these succeed if tried again. Before, they went down the same path as a permanent data error, so depending onspock.exception_behaviourthe subscription was disabled or the transaction was written tospock.exception_logand thrown away, even though the provider would happily have sent it again. Now the worker exits without moving the replication origin, the manager starts it again, and the provider resends the transaction. Every restart path, including the existing one for a lost connection, now waitsspock.restart_delay_defaultbefore starting again, so a problem that does not clear cannot turn into a tight restart loop. -
Tables with
GENERATED ALWAYS AS ... STOREDcolumns caused replication errors. Generated columns were handled like ordinary columns during the initial table copy, in the replication protocol, when filling in defaults for missing columns, and during conflict resolution. They are now left out everywhere, and the subscriber computes them from the column definition. -
AutoDDL failed after utility commands that run outside a transaction block, such as
CLUSTERwith no table name. These commands commit after each table, so by the time the AutoDDL hook ran there was no open transaction and no snapshot, and the catalog lookups and the queue insert failed. AutoDDL now starts a transaction and takes a snapshot itself when it needs to. -
spock.get_lsn_from_commit_ts()could hang on an idle node. The function scans the node's WAL for the last local commit at or before a timestamp, but the scan had no stopping point, so once it caught up it sat waiting for WAL that nobody was going to write. Anadd_noderun was seen stuck behind this call for over eleven minutes. The scan now stops at the end of WAL as it stood when it began, takes the commit timestamp and origin from the WAL record instead ofpg_commit_ts, counts local two-phase commits written by other applications, and refuses to run on a server in recovery. A timestamp with no matching commit still returns the slot'srestart_lsn, now logged at DEBUG1. -
A failure between transactions could make the apply worker mishandle the next one. When a transaction fails to apply, the worker restarts, the provider resends it, and the worker runs it again in what the code calls replay mode: each row is tried in a subtransaction so the failing row can be written to
spock.exception_logandspock.exception_behaviourcan decide what to do with it. Replay mode is meant for that one transaction. But an error raised between transactions switched the worker into replay mode with no failed transaction to attach it to, and the flag stayed set for whatever the provider sent next. That transaction, which had never failed, ran as a replay and underTRANSDISCARDorSUB_DISABLEwas thrown away or used to disable the subscription. The worker now turns replay mode on only for the transaction that actually failed, and any other transaction clears the recorded failure. -
A replayed transaction that applied nothing was still committed. Under
TRANSDISCARDandSUB_DISABLEevery row of a replay runs in a subtransaction that is always rolled back, so a replay applies no rows. The check for "replayed but hit no error" ran only after the replication origin had moved forward and the transaction had committed, so the origin ended up past a transaction that was never applied. The transaction was lost while the log said it had been discarded on purpose. The check now runs first and the transaction is rolled back instead, so the provider resends it. Transactions skipped withspock.sub_alter_skiplsnare exempt. -
Two subscriptions whose names share a prefix (for example
subandsub_parallel) shared one exception-log slot, because the lookup compared only the first few characters. Sharing the slot means sharing the commit LSN that marks a transaction as having already failed, so a failure recorded by one subscription could push the other into replay mode for a transaction that never failed. The lookup now compares the whole name. The same code also read, and could have written, one entry past the end of the array. -
The failover-slots worker died whenever the walreceiver reconnected to the primary. Without
spock.primary_dsnthe worker takes the primary's connection string from the walreceiver, which blanks that string for the whole of every connection attempt, not only at standby startup. The connection then failed, the worker exited, and failover slots stopped syncing until it restarted. The worker now waits for the next cycle. -
Two retry messages for serialization failures are lowered from LOG to DEBUG1, but the check that decides whether to print them at the new level was backwards. With default settings they went to the server log no matter what
log_min_messagessaid. Also marked a deliberate switch fall-through in the apply worker so clang stops warning about it on every build before PostgreSQL 19. -
Restarting an apply worker in the middle of a transaction could disable the subscription. The worker records the commit LSN of every transaction it begins, not only ones that fail, and a clean shutdown left the marker behind, so the provider's resend of the interrupted transaction looked like a transaction that had already failed. Under
SUB_DISABLEthat disabled the subscription for no real error. The marker is now cleared when the worker exits onSIGTERM. -
A column that exists on the provider but not on the subscriber put the apply worker in a restart loop. The error was raised while opening the table, before the per-row subtransaction exception handling needs, so
spock.exception_behaviournever got a say and the error came back on every retry without end. A missing column is now handled like a missing table: the first attempt raises the error, the retry discards the change and logs it through the normal exception path. The message also names every column the local table is missing, so repairing a drifted schema no longer costs one column per apply attempt. -
Tuple data arriving on the wire is now checked against the local column definition before it is used. Each attribute is copied out of the message into its own buffer and its length checked, so a tuple that does not fit the local column is rejected rather than applied. That is what happens after a provider-only
ALTER COLUMN TYPEwith DDL replication off: the apply worker exits and retries until the two schemas agree. Names and attribute counts in the RELATION message are validated too, and a subscriber built without lz4 now rejects an lz4-compressed value instead of storing it.
Other Changes
-
Refreshed the
attoptionsserver patch for theheap_update()change in PostgreSQL 17.11, 18.5 and 19 beta 3. One hunk's context lines no longer matched and the patch was rejected. Only context lines changed. -
Spock builds against PostgreSQL 19 beta 3, with a new
compat/19layer for the API changes in that beta (CLUSTERfolded intoREPACK, the recovery-conflict signalling changes, tuple-descriptor finalisation, and the flattenedReorderBufferTXNcommit-time field).CREATE EXTENSIONaccepts major version 19, and CI and the release packaging cover it. This is preliminary: PostgreSQL 19 is still in beta, the compatibility layer will change before it is released, and Spock on 19 is not supported for production use. -
Dropped Debian bullseye from the platforms the release workflow builds packages for. It has reached end of life.
-
Removed the old Z0DAN Python files and their TAP test.
add_nodeandremove_nodeare provided by the SQL implementation. -
New documentation on running logical slot failover under Patroni on PostgreSQL 17 and later. It covers the parameters you need, the settings to put in the bootstrap DCS, and what to do about
synchronized_standby_slotson a switchover. A sample Patronion_role_changecallback,samples/set_synchronized_standby_slots.sh, resetssynchronized_standby_slotsafter a promotion. See Logical Slot Failover. -
Documented the
wait_if_disabledargument ofspock.wait_for_sync_event(). -
TAP suite: tests share one set of log and wait helpers instead of each carrying a copy, cluster startup waits for the servers to be ready instead of sleeping 17 seconds, and a single test can be run on its own with
prove. New tests cover retry after temporary errors, real deadlocks, replay mode carrying over between transactions,spock.get_lsn_from_commit_ts(), a worker restart in the middle of a transaction, and a column missing on the subscriber.
Spock 5.0.11
New Features
-
Add
spock.use_native_failover_slots(default off, PGC_POSTMASTER). When enabled, spock marks logical slots with the FAILOVER flag on PG17+, yields to PostgreSQL's native slotsync worker on PG17 whensync_replication_slots=on, and does not register spock's own failover-slot worker on PG18+. Off preserves the existing worker-based behavior. Read on the subscriber node that creates the logical replication slot; changing it requires a server restart. See Logical Slot Failover for setup steps and the required post-promotionsynchronized_standby_slotsrunbook. -
Sync failover slots to the standby every 1s by default instead of a hard-coded 60s, shrinking the window in which a promotion can find a stale slot. The interval is now tunable via
spock.failover_slots_naptime(and the feedback-wait retry viaspock.failover_slots_feedback_naptime), both SIGHUP-settable in milliseconds -
Never copy the
pgedge_aceschema to a node joining viaadd_node. ACE state is node-local, so its objects are now excluded from both the schema copy and the data sync, even when an ACE table belongs to a replication set.
Bug Fixes
- Fixed a bug where a transient provider connection loss could incorrectly disable a subscription under SUB_DISABLE exception handling. A transaction retransmitted after a reconnect is no longer misclassified as an apply failure, so replication resumes normally instead of stopping.
Spock 5.0.10
Bug Fixes
- Improve apply performance on tables with a unique index over a frequently NULL column. Rows with a NULL in such a key are now recognized as non-conflicting without an unnecessary index scan, avoiding a slowdown that grew with table size.
- Correctly handle conflicts on
NULLS NOT DISTINCTunique indexes. On these indexes (PostgreSQL 15+) two NULL values are treated as equal, so matching NULL-keyed rows are now resolved through normal conflict resolution (last-update-wins) instead of failing with a duplicate-key error. - Fix a
could not open relationerror in the apply worker when an index is dropped while replication is running. The worker now refreshes its cached view of a table's indexes before using it. - Fix gradual memory growth during a transaction that logs to
spock.exception_log. Memory used while recording exceptions is now released per row instead of accumulating until the transaction commits. - Record the real cause of a discarded transaction in
spock.exception_loginstead of the opaque placeholderunavailable. The failing command's message is now stored (prefixed with its SQLSTATE where informative), and the other rows of the transaction note that they were discarded as collateral, making it possible to provide the root cause of the exception. - Fix ZODAN (
add_node) version checking. Spock versions were compared as text, so5.0.10sorted below5.0.4and a valid node was wrongly rejected. Versions are now compared numerically, and nodes may differ in patch level as long as their major.minor matches, allowing rolling upgrades.
Spock 5.0.9
New Features
- Initial PostgreSQL 19 support. Adds the server-side patches required to build and run Spock against PostgreSQL 19.
Bug Fixes
- Fix silently dropped writes after a synchronous-standby failover. Spock could report an incorrect replication position to the publisher, so a promoted standby resumed from the wrong point and lost the changes in between. The position reported to the publisher is now always taken from the publisher's own WAL stream.
- Fix
spock_failover_slotsstalling on PG17+ standbys. Slot synchronization could hold replication-slot and proc-array locks exclusively long enough to block every backend trying to start up on the standby, freezing the worker and any new connections. The sync path now uses shorter, shared locks matching PostgreSQL's own slot code. - Fix manager-worker respawn loop when databases are dropped or have
connections disabled (
datconnlimit = -2) concurrently with Spock starting a per-database worker. The database OID is now revalidated immediately before the worker is registered to avoid race. - Reduce per-row work and memory growth in the apply path. Replicated changes no longer re-open a table's indexes for every row, and transient memory is freed per row instead of building up over the transaction.
Performance
- Skip building conflict log messages that would not be logged. When the log
level is suppressed, Spock no longer formats the conflicting rows for an
ereport()that would be discarded, speeding up apply on high-conflict workloads. Recording conflicts inspock.resolutionsis unaffected.
Spock 5.0.8
Bug Fixes
- Fix subscriber crash on transactions larger than 2 GB.
apply_replay_byteswas declared asint, causing signed-integer overflow and a crash when a single replicated transaction exceeded 2 GB of WAL data. Changed touint64. - The apply worker now exits cleanly when the upstream connection dies
(firewall reload, walsender SIGKILL/RST, walsender ping timeout) and the
manager respawns it from the last durably-committed remote LSN. Previously
a stale libpq socket fd produced an
epoll_ctl()cascade with a follow-onerror during exception handlingper disconnect, and a corner of the recovery path could silently advance the replication origin past the in-flight remote transaction, causing it to be skipped on reconnect. - Removed native PG17+/PG18 slot-sync integration. Spock no longer creates slots with (FAILOVER), does not defer to PostgreSQL's slotsync worker, and keeps spock_failover_slots active on PG18; the spock worker is once again the only path for failover-slot sync on 5.x.
- spock_failover_slots: handle primary disconnects and post-promotion edge cases. Reconnects to the primary on transient failure during sync; fixes a PG15/16 PANIC where a freshly promoted standby could enter a crash loop because the synchronized slot's restart_lsn was below the standby's WAL floor; tolerates invalid/zero LSNs and catalog_xmin values that previously tripped assertions.
Spock 5.0.7
New Features
Logical Slot Failover Improvements
- On PostgreSQL 17+, Spock now creates all logical replication slots with
the
FAILOVERflag, allowing PostgreSQL's built-in slotsync worker (sync_replication_slots = on) to automatically synchronize them to physical standbys. - On PostgreSQL 18+, Spock's own
spock_failover_slotsbackground worker is no longer registered. The native PostgreSQL slotsync worker fully replaces it. See the Logical Slot Failover section in the configuration guide for requiredpostgresql.confsettings. - On PostgreSQL 17, Spock's worker remains active but automatically yields
to the native slotsync worker if
sync_replication_slots = onis set, preventing conflicts.
Bug Fixes
- Preserve the original error message in
spock.exception_logwhen applying inTRANSDISCARDorSUB_DISABLEmode. Previously the original error was written only to the server log and lost before the retry pass; every row in the discarded transaction was logged witherror_message = NULL(stored as "unknown"). The originally-failing row now carries the real error message, while the bystander rows in the same transaction are recorded as "unavailable" instead of the misleading "unknown" fallback. - Fix missing data when adding a new node. An apply worker that committed
between
ensure_replication_slot_snapshotandadjust_progress_infocould advancespock.progresspast the COPY snapshot boundary, causing the new node to permanently skip those changes. Apply workers are now paused via an atomic flag and condition variable inSpockContextfor the duration of slot creation and resumed onceadjust_progress_infocompletes. - Fix apply worker crash with
epoll_ctl() failed: Invalid argumentafter a provider connection died. The socket fd captured beforestream_replay:was never refreshed, so a stale fd was passed toWaitLatchOrSocketon re-entry. The fd is now refreshed atstream_replay:and the worker exits cleanly so the postmaster can restart and reconnect it. - Fix PG15/16 failover slot loss on promotion: reconnect with retry and guard against a zero WAL flush LSN.
- ZODAN:
create_sub_on_new_node_to_src_node(Phase 9 ofadd_node) was generating subscription names assub_{subscriber}_{provider}instead of the expectedsub_{provider}_{subscriber}convention, causingremove_nodeto fail when looking up subscriptions by name. A newspock.gen_sub_name(provider_node, subscriber_node)helper is now used in place of inline name concatenations. - ZODAN: the
remove_nodecleanup loop tried to drop subscriptions by guessing names and nodes, which broke whenevercross_wireandadd_nodeused different naming conventions. It now performs a per-nodeDROPof every subscription read directly from thespock.subscriptioncatalog. - Since 5.0.2 there was a bug with spock.subscription.sub_skip_schema having the incorrect type, it should be text[]. Fixed, including in the spock-5.0.6--5.0.7.sql migration script to repair.
- Fix a rare bug where under high concurrency when using delta apply columns a ResourceOwner exception may occur.
- Have more meaningful messages appear in spock.exception_log.
Operational Improvements
- Documentation: filled out
snowflake.md; revisedupgrading_spock.md; fixed event-trigger syntax (EXECUTE FUNCTIONinstead of the deprecatedEXECUTE PROCEDURE); standardized function-reference filenames to match function names exactly; removed obsoletebatch_inserts.md - Test infrastructure aligned with
main:run_tests.shandSpockTest.pmnow use absoluteTESTLOGDIRpaths, derive per-test log filenames, and isolatepsqlfrom a developer'spsqlrc/history. New regression tests added for failover slots (018), exception-handling/TRANSDISCARD error quality (013), and the stale-fd-after-connection-death scenario (019). - Avoid unnecessarily waiting after sync_event()
Spock 5.0.6
New Features
- New
spock.feedback_frequencyGUC that controls how often feedback is sent to the WAL sender. Feedback is sent every n messages, where n is the configured value. Note that feedback is also sent every wal_sender_feedback / 2 seconds. - New
spock.log_origin_changeGUC to control logging of row origin changes to the PostgreSQL log. Origin changes caused by replication are no longer written to thespock.resolutionstable, as they are informational and not true conflicts. Three modes are available:none— Do not log origin changes (default)remote_only_differs— Log only when a row from one remote publisher is updated by a different remote publishersince_sub_creation— Log origin changes for tuples modified after subscription creation (suppresses noise from pg_restored data)
- New
sub_created_atcolumn onspock.subscriptionto help distinguish pre-existing data (e.g. from pg_restore) from post-subscription data. - COPY TO is considered read-only and can now be run when a node is in read-only mode.
Performance Improvements
- Deferred
spock.progresscatalog writes. The progress table was previously updated on every committed transaction and every keepalive, causing significant table bloat and I/O overhead. Progress catalog writes are now batched and flushed at most once per second from the main apply loop. Shared memory is still updated immediately internally for correctness.
Bug Fixes
- Fix initdb assertion failure in attoptions patch for PG15/16/17.
- Fix two bugs in the table re-sync routine: WAL sending is now switched off during truncate and re-sync to prevent data loss, and the infinite wait was fixed when no more DML is committed by using the last committed LSN instead of the last received LSN.
- Use NULL for unknown
local_origininspock.resolutionsinstead of an invalid origin ID when origin cannot be determined (e.g. pg_dump, frozen transactions, truncated commit timestamps). Also fixed off-by-one errors inspock_conflict_row_to_json()that were overwriting thelocal_originNULL flag. - Fix Z0DAN initialization issue:
present_final_cluster_statenow executes a COMMIT to allow newly created subscriptions to update their state, and final cluster state now checks all subscriptions across the cluster. - Suppress hot_standby_feedback off error messages in log in case a read replica is used for reporting and not failover (it is required for failover).
- Fix bug when applying changes to a table that has been dropped.
Operational Improvements
add_nodeis now restricted to run only on a new (uninitialized) node, preventing accidental misuse.
Spock 5.0.5 on Feb 12, 2026
- Fix segfault that occurs when using new Postgres minor releases like 18.2.
- Zero Downtime Add Node (Zodan) minor bug fixes and improvements
- Updated documentation
Spock 5.0.4 on Oct 8, 2025
- Reduce memory usage for transactions with many inserts.
- When a subscriber’s apply worker updates a row that came from the same
origin, spock will no longer log it in the
spock.resolutionstable, reversing behavior that has been in place since 5.0.0. - Improved handling to block replicating DDL when adding an extension.
- Improved documentation
-
Zero Downtime Add Node Improvements:
- New health checks and verifications (ex: version compatibility) before and during the add node process.
- New remove node SQL procedure (
spock.remove_node()in samples/Z0DAN/zodremove.sql) and python script (samples/Z0DAN/zodremove.py). This also handles removing nodes that were partially added when the user decided to undo this work. - Handle DSN strings that contain quotes.
-
Bug fixes:
- Log messages containing credentials will now obfuscate password information.
- Fix bug when the subscriber receives DML for tables that do not exist.
This case will be handled according to the configured
spock.exception_behavioursetting (SUB_DISABLE,DISCARD,TRANSDISCARD). - Fix bug where spock incorrectly outputs a message that DDL was replicated when a transaction is executing in repair mode.
v5.0.3 on Sep 26, 2025
- Spock 5.0.3 adds support for Postgres 18.
- When using row filters with Postgres 18 such as in the functions spock.repset_add_table() or spock.repset_add_partition(), allowable filters are now stricter. Expressions may not use UDFs nor reference another table, similar to native logical replication in Postgres.
v5.0.2 on Sept 22, 2025
- Improved logging for all Zodan phases in both the stored procedure and Python examples.
- You can use the new Zodan skip_schema parameter to exclude schemas when
you're adding a node, preventing local extension metadata from being copied.
- Added skip_schema option to sub_create. When synchronize_structure = true, schemas listed in skip_schema are not synced.
- dblink-based stored procedure for add node leverages skip_schema to skip preexisting schemas on the new node, avoiding failures on already existing schemas.
- Python add_node now mirrors stored procedure semantics, including skip_schema handling, structure sync, and logging. It works as a direct alternative to the procedure and no longer requires the dblink extension.
- Spock has been updated to use the PostgreSQL License.
v5.0.1 on Aug 27, 2025
- Bug fix for an incorrect commit timestamp being used for the case of updating a row that was inserted in the same transaction. A consequence was possible incorrect resolution handling for updates.
- Use the default search_path in the replicate_ddl() function.
- Prevent false positives for conflict detection when using partial unique indexes.
- New sample files for adding nodes with zero downtime.
- Python example
- Added enhanced add node support in stored procedures in
samples/zodan.sql
- Add a second node when there is only one node.
- Extended support for adding 3rd, 4th and subsequent nodes.
- Chain adding new nodes off of the previously added new node (eg: add N2 off N1, then add N3 off N2).
v5.0 on July 15, 2025
- Spock functions and stored procedures now support node additions and major
PostgreSQL version. This means:
- existing nodes are able to maintain full read and write capability while a new node is populated and added to the cluster.
- You can perform PostgreSQL major version upgrades as a rolling upgrade by adding a new node with the new major PostgreSQL version, and then removing old nodes hosting the previous version.
- Exception handling performance improvements are now managed with the spock.exception_replay_queue_size GUC.
- Previously, replication lag was estimated on the source node; this meant that if there were no transactions being replicated, the reported lag could continue to increase. Lag tracking is now calculated at the target node, with improved accuracy.
- Spock 5.0 implements LSN Checkpointing with
spock.sync()andspock.wait_for_sync_event(). This feature allows you to identify a checkpoint in the source node WAL files, and watch for the LSN of the checkpoint on a replica node. This allows you to guarantee that a DDL change, has replicated from the source node to all other nodes before publishing an update. - The
spockctrlcommand line utility and sample workflows simplify the management of a Spock multi-master replication setup for PostgreSQL.spockctrlprovides a convenient interface for:- node management
- replication set management
- subscription management
- ad-hoc SQL execution
- workflow automation
- Previously, replicated
DELETEstatements that attempted to delete a missing row were logged as exceptions. Since the purpose of aDELETEstatement is to remove a row, we no longer log these as exceptions. Instead these are now logged in theResolutionstable. INSERTconflicts resulting from a duplicate primary key or identity replica are now transformed into anUPDATEthat updates all columns of the existing row, using Last-Write-Wins (LWW) logic. The transaction is then logged in the node’sResolutionstable, as either:keep localif the local node’sINSERThas a later timestamp than the arrivingINSERTapply remoteif the arrivingINSERTfrom the remote node had a later timestamp
- In a cluster composed of distributed and physical replica nodes, Spock 5.0
improves performance by tracking the Log Sequence Numbers (LSNs) of
transactions that have been applied locally but are still waiting for
confirmation from physical replicas. A final
COMMITconfirmation is provided only after those LSNs are confirmed on the physical replica. This provides a two-phase acknowledgment: - Once when the target node has received and applied the transaction.
- Once when the physical replica confirms the commit.
- The
spock.check_all_uc_indexesGUC is an experimental feature (disabledby default); use this feature at your own risk. If this GUC isenabled, Spock will continue to check unique constraint indexes, after checking the primary key / replica identity index. Only one conflict will be resolved, using Last-Write-Wins logic. If a second conflict occurs, an exception is recorded in thespock.exception_logtable.
Version 4.1
- Hardening Parallel Slots for OLTP production use.
- Commit Order
- Skip LSN
- Optionally stop replicating in an Error
- Enhancements to Automatic DDL replication
Version 4.0
- Full re-work of paralell slots implementation to support mixed OLTP workloads
- Improved support for delta_apply columns to support various data types
- Improved regression test coverage
- Support for Large Object LOgical Replication
- Support for pg17
Our current production version is v3.3 and includes the following enhancements over v3.2:
- Automatic replication of DDL statements
Version 3.2
- Support for pg14
- Support for Snowflake Sequences
- Support for setting a database to ReadOnly
- A couple small bug fixes from pgLogical
- Native support for Failover Slots via integrating pg_failover_slots extension
- Parallel slots support for insert only workloads
Version 3.1
- Support for both pg15 and pg16
- Prelim testing for online upgrades between pg15 & pg16
- Regression testing improvements
- Improved support for in-region shadow nodes (in different AZ's)
- Improved and document support for replication and maintaining partitioned tables.
Version 3.0 (Beta) includes the following important enhancements beyond the BDR/pg_logical base:
- Support for pg15 (support for pg10 thru pg14 dropped)
- Support for Asynchronous Multi-Master Replication with conflict resolution
- Conflict-free delta-apply columns
- Replication of partitioned tables (to help support geo-sharding)
- Making database clusters location aware (to help support geo-sharding)
- Better error handling for conflict resolution
- Better management & monitoring stats and integration
- A 'pii' table for making it easy for personally identifiable data to be kept in country
- Better support for minimizing system interuption during switch-over and failover