BUG #19647: Difference in pg_basebackup behaviour between PostgreSQL <= 16 and >= 17 with pgactive extension

From: PG Bug reporting form <noreply(at)postgresql(dot)org>
To: pgsql-bugs(at)lists(dot)postgresql(dot)org
Cc: edwin(dot)polkerman(at)splendiddata(dot)com
Subject: BUG #19647: Difference in pg_basebackup behaviour between PostgreSQL <= 16 and >= 17 with pgactive extension
Date: 2026-08-30 17:08:49
Message-ID: 19647-d18354ebe2134a6d@postgresql.org
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

The following bug has been logged on the website:

Bug reference: 19647
Logged by: Edwin Polkerman
Email address: edwin(dot)polkerman(at)splendiddata(dot)com
PostgreSQL version: 15.19
Operating system: Linux (See details)
Description:

Operating system:
I have tested this on SUSE15 SP7 x86_64 and ppc64le, RHEL8/9 x86_64 and
ppc64le, RHEL10 x86_64, Rocky Linux 8/9/10 x86_64 and every time having the
same results.

The start situation is a postgresql instance (data checksums on) with
extension pgactive (version 2.1.8) installed in a database (CREATE EXTENSION
pgactive;), in "shared_preload_libraries" and added to new parameter
"output_plugin_libraries". Following step is to take an base backup with
pg_basebackup.

In PostgreSQL versions 18.6 and 17.11 this succeeds without any problem.
However in PostgreSQL versions 16.15, 15.19 and 14.24 the backup process
fails.

FAIL SITUATION:

postgres=# select version();
version
--------------------------------------------------------------------------------------
PostgreSQL 15.19 on x86_64-pc-linux-gnu, compiled by gcc (SUSE Linux)
14.3.0, 64-bit
(1 row)

postgres=# select name, setting, category, short_desc from pg_settings where
name='data_checksums';
name | setting | category |
short_desc
----------------+---------+----------------+--------------------------------------------------------------
data_checksums | on | Preset Options | Shows whether data checksums
are turned on for this cluster.
(1 row)

For database app extension pgactive is installed and configured:

postgres=# \c app

app=# SELECT * from pgactive.pgactive_nodes;
-[ RECORD 1
]------+------------------------------------------------------------------------
node_sysid | 7679811947370996481
node_timeline | 0
node_dboid | 16669
node_status | r
node_name | endpoint1-app
node_dsn | user_mapping=splendid
pgactive_foreign_server=pgactive_server_endpoint1
node_init_from_dsn |
node_read_only | f
node_seq_id | 1
-[ RECORD 2
]------+------------------------------------------------------------------------
node_sysid | 7679811972576347006
node_timeline | 0
node_dboid | 16386
node_status | r
node_name | endpoint2-app
node_dsn | user_mapping=splendid
pgactive_foreign_server=pgactive_server_endpoint2
node_init_from_dsn | user_mapping=splendid
pgactive_foreign_server=pgactive_server_endpoint1
node_read_only | f
node_seq_id | 2

Creating an base backup:
> pg_basebackup -p 5442 -D /basebackup/backup/15/pg_basebackup_pg15pgactive
-X s -P -v -R
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/44000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created temporary replication slot "pg_basebackup_14961"
pg_basebackup: error: COPY stream ended before last file was finished617_vm)
pg_basebackup: removing data directory
"/basebackup/backup/15/pg_basebackup_pg15pgactive"

Logging from the database server shows following:
2026-08-30 16:31:45 CEST pid:14641 xid:0 ip: LOG: checkpoint starting:
force wait
2026-08-30 16:31:45 CEST pid:14641 xid:0 ip: LOG: checkpoint complete:
wrote 0 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled;
write=0.003 s, sync=0.001 s, total=0.009 s; sync files=0, longest=0.000 s,
average=0.000 s; distance=16383 kB, estimate=16383 kB
2026-08-30 16:31:48 CEST [unknown] postgres pid:14959 xid:0 ip:[local]
ERROR: invalid segment number 0 in file "pgactive.stat"
2026-08-30 16:31:48 CEST [unknown] postgres pid:14959 xid:0 ip:[local]
STATEMENT: BASE_BACKUP ( LABEL 'pg_basebackup base backup', PROGRESS,
WAIT 0, MANIFEST 'yes', TARGET 'client')
2026-08-30 16:31:48 CEST [unknown] postgres pid:14961 xid:0 ip:[local] LOG:
unexpected EOF on standby connection
2026-08-30 16:31:48 CEST [unknown] postgres pid:14961 xid:0 ip:[local]
STATEMENT: START_REPLICATION SLOT "pg_basebackup_14961" 0/44000000 TIMELINE
1

The ERROR message shows file pgactive.stat, which is probably placed by the
pgactive extension in the "global" directory in PGDATA
Stopped the server and run pg_checksum to verify:
> pg_checksums -c /var/pgpure/postgres/15/cluster2/
pg_checksums: error: invalid segment number 0 in file name
"/var/pgpure/postgres/18/cluster2//global/pgactive.stat"

As said, this behaviour is seen for 16.15, 15.19 and 14.24.

GOOD SITUATION:
postgres=# select version();
version
-------------------------------------------------------------------------------------
PostgreSQL 18.6 on x86_64-pc-linux-gnu, compiled by gcc (SUSE Linux)
14.3.0, 64-bit
(1 row)

postgres=# select name, setting, category, short_desc from pg_settings where
name='data_checksums';
name | setting | category |
short_desc
----------------+---------+----------------+--------------------------------------------------------------
data_checksums | on | Preset Options | Shows whether data checksums
are turned on for this cluster.
(1 row)

For database app extension pgactive is installed and configured:
postgres=# \c app

app=# SELECT * from pgactive.pgactive_nodes;
-[ RECORD 1
]------+------------------------------------------------------------------------
node_sysid | 7678809857720063909
node_timeline | 0
node_dboid | 16702
node_status | r
node_name | endpoint1-app
node_dsn | user_mapping=splendid
pgactive_foreign_server=pgactive_server_endpoint1
node_init_from_dsn |
node_read_only | f
node_seq_id | 1
-[ RECORD 2
]------+------------------------------------------------------------------------
node_sysid | 7678809889904381387
node_timeline | 0
node_dboid | 16386
node_status | r
node_name | endpoint2-app
node_dsn | user_mapping=splendid
pgactive_foreign_server=pgactive_server_endpoint2
node_init_from_dsn | user_mapping=splendid
pgactive_foreign_server=pgactive_server_endpoint1
node_read_only | f
node_seq_id | 2

Creating an base backup:
pg_basebackup -p 5442 -D /basebackup/backup/18/pg_basebackup_pg18pgactive -X
s -P -v -R
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/55000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created temporary replication slot "pg_basebackup_141732"
372246/372246 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/55000120
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: renaming backup_manifest.tmp to backup_manifest
pg_basebackup: base backup completed

For PostgreSQL 18.6 and 17.11 the backup completes without any problems.

The strange thing is that also here pg_checksums reports about file
pgactive.stat???
> pg_checksums -c /var/pgpure/postgres/18/cluster2/
pg_checksums: error: invalid segment number 0 in file name
"/var/pgpure/postgres/15/cluster2//global/pgactive.stat"

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2026-08-30 18:03:58 Re: BUG #19487: Error while executing SQL query involving XML parsing
Previous Message Tom Lane 2026-08-30 15:14:03 Re: BUG #19595: Three memory-safety defects in src/backend/tsearch/spell.c (dictionary loader), PG 18.3