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
Validation PR for the-process
[#241](citusdata/the-process#241). Repoints CI
at the freshly built dev images carrying the new PostgreSQL minors
published 2026-08-14/15.
| | before | after |
|---|---|---|
| PG15 | 15.18 | 15.19 |
| PG16 | 16.14 | 16.15 |
| PG17 | 17.10 | 17.11 |
`image_suffix`: `-dev-34d3b6f`
---
## Fallout from the new minors
Validation surfaced two independent PostgreSQL security changes in this
minor set that break Citus.
### 1. psql `COPY FROM STDIN` (fixed here)
When a `COPY` fails early, the new psql silently swallows every line up
to and including the next `\.`. Tests that relied on the old behaviour
were adjusted: a terminating `\.` was added where one was missing, stray
statements after a swallowed block were removed, and expected output was
trimmed for the lines that no longer execute.
### 2. `output_plugin_libraries` (fixed here)
PostgreSQL 14.24, 15.19, 16.15, 17.11 and 18.6 add an
`output_plugin_libraries` GUC. Only the libraries it lists may be used
as logical decoding output plugins. It defaults to `pgoutput,
test_decoding` and is `superuser`-settable, so it takes a reload rather
than a restart.
**Upgrade note for operators.** Citus uses an output plugin named
`citus` for logical replication during non-blocking shard splits. On
these minors the following fail until the plugin is allowed:
* `citus_split_shard_by_split_points(..., 'force_logical')` and `'auto'`
* `create_distributed_table_concurrently()`
* `citus_isolate_tenant_to_new_shard(..., 'force_logical'` / `'auto')`
Shard **moves** and the rebalancer are unaffected -- they use
`pgoutput`. CDC through the `pgoutput` shim is unaffected; CDC through
`wal2json` needs the same treatment, exactly as it does on vanilla
PostgreSQL.
Remediation, on **every** node:
```sql
ALTER SYSTEM SET output_plugin_libraries = pgoutput, test_decoding, citus;
SELECT pg_reload_conf();
```
The GUC is `GUC_LIST_QUOTE`, so quoting the whole list (`'pgoutput,
test_decoding, citus'`) stores it as a single name and does **not**
work. Use the bare list above, or quote each element individually.
This PR does not work around the restriction -- allowing a decoder is
deliberately an operator action. Instead Citus now **fails fast and
clearly**: a preflight check runs against the source node before any
shards, publications or replication slots are created, and raises an
error naming the plugin, the node, the current allowlist value, and a
ready-to-paste `ALTER SYSTEM` hint.
### Testing
The regression and CDC harnesses start their own clusters, so in CI *we*
are the operator: `pg_regress_multi.pl` and `cdctestlib.pm` now write
the allowlist themselves, guarded by a probe of `postgresql.conf.sample`
so they stay compatible with older minors where the GUC does not exist.
To keep the un-remediated path covered, a new
`check-split-output-plugin-denied` job deliberately skips that override
(via `CITUS_TEST_SKIP_OUTPUT_PLUGIN_ALLOWLIST=1`) and asserts that a
non-blocking split fails with the new error and leaks no shards,
publications or replication slots.
---
**Draft:** these are `-dev-` images. Do not merge until the-process
[#241](citusdata/the-process#241) is merged and
this PR is repointed at the resulting release image tag.
---------
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 7c6370b2-06fd-4491-bf92-ecb811d34518
Copy file name to clipboardExpand all lines: src/test/regress/expected/multi_follower_dml.out
-14Lines changed: 0 additions & 14 deletions
Original file line number
Diff line number
Diff line change
@@ -227,26 +227,18 @@ COPY the_table (a, b, z) FROM STDIN WITH CSV;
227
227
ERROR: COPY command to Citus tables is not allowed in read-only mode
228
228
DETAIL: the database is read-only
229
229
HINT: All COPY commands to citus tables happen via 2PC, and 2PC requires the database to be in a writable state.
230
-
\.
231
-
invalid command \.
232
230
COPY the_replicated_table (a, b, z) FROM STDIN WITH CSV;
233
231
ERROR: writing to worker nodes is not currently allowed for replicated tables such as reference tables or hash distributed tables with replication factor greater than 1.
234
232
DETAIL: the database is read-only
235
233
HINT: All modifications to replicated tables happen via 2PC, and 2PC requires the database to be in a writable state.
236
-
\.
237
-
invalid command \.
238
234
COPY reference_table (a, b, z) FROM STDIN WITH CSV;
239
235
ERROR: writing to worker nodes is not currently allowed for replicated tables such as reference tables or hash distributed tables with replication factor greater than 1.
240
236
DETAIL: the database is read-only
241
237
HINT: All modifications to replicated tables happen via 2PC, and 2PC requires the database to be in a writable state.
242
-
\.
243
-
invalid command \.
244
238
COPY citus_local_table (a, b, z) FROM STDIN WITH CSV;
245
239
ERROR: COPY command to Citus tables is not allowed in read-only mode
246
240
DETAIL: the database is read-only
247
241
HINT: All COPY commands to citus tables happen via 2PC, and 2PC requires the database to be in a writable state.
248
-
\.
249
-
invalid command \.
250
242
-- all multi-shard modifications require 2PC hence not supported
ERROR: cannot assign TransactionIds during recovery
@@ -299,20 +291,14 @@ COPY the_table (a, b, z) FROM STDIN WITH CSV;
299
291
ERROR: COPY command to Citus tables is not allowed in read-only mode
300
292
DETAIL: the database is read-only
301
293
HINT: All COPY commands to citus tables happen via 2PC, and 2PC requires the database to be in a writable state.
302
-
\.
303
-
invalid command \.
304
294
COPY reference_table (a, b, z) FROM STDIN WITH CSV;
305
295
ERROR: writing to worker nodes is not currently allowed for replicated tables such as reference tables or hash distributed tables with replication factor greater than 1.
306
296
DETAIL: the database is read-only
307
297
HINT: All modifications to replicated tables happen via 2PC, and 2PC requires the database to be in a writable state.
308
-
\.
309
-
invalid command \.
310
298
COPY citus_local_table (a, b, z) FROM STDIN WITH CSV;
311
299
ERROR: COPY command to Citus tables is not allowed in read-only mode
312
300
DETAIL: the database is read-only
313
301
HINT: All COPY commands to citus tables happen via 2PC, and 2PC requires the database to be in a writable state.
0 commit comments