Hi, hackers I've run into a build issue when trying to use pg_probackup with PostgreSQL 18beta1. After some adjustments to pg_probackup, I encountered the following linker errors:
/usr/bin/ld: src/pg_crc.o: in function `crc32_bytea': /home/japin/Codes/extensions/pg_probackup/src/pg_crc.c:109:(.text+0x40): undefined reference to `pg_detoast_datum_packed' /usr/bin/ld: src/pg_crc.o: in function `crc32c_bytea': /home/japin/Codes/extensions/pg_probackup/src/pg_crc.c:122:(.text+0x1a1): undefined reference to `pg_detoast_datum_packed' collect2: error: ld returned 1 exit status make: *** [/data/Codes/ngdb/main/build/ngdb/lib/postgresql/pgxs/src/makefiles/pgxs.mk:478: pg_probackup] Error 1 It appears that PostgreSQL commit 760162f introduced user-callable CRC functions. Since pg_probackup leverages pg_crc.c from the PostgreSQL source, this change is leading to the "undefined reference to pg_detoast_datum_packed" errors during the build. To resolve this, I'm wondering about wrapping these user-callable CRC functions with an #ifndef FRONTEND block: #ifndef FRONTEND ... // user-callable CRC functions here #endif This would ensure these functions are only included in the backend compilation and avoid linker issues when building extensions like pg_probackup. Any thoughts or alternative suggestions would be greatly appreciated! -- Regards, Japin Li
diff --git a/src/backup.c b/src/backup.c index 78c3512e..e23b2210 100644 --- a/src/backup.c +++ b/src/backup.c @@ -2513,7 +2513,11 @@ void process_block_change(ForkNumber forknum, RelFileNode rnode, BlockNumber blkno) { // char *path; +#if PG_VERSION_NUM < 180000 char *rel_path; +#else + RelPathStr rel_path; +#endif BlockNumber blkno_inseg; int segno; pgFile **file_item; @@ -2524,9 +2528,17 @@ process_block_change(ForkNumber forknum, RelFileNode rnode, BlockNumber blkno) rel_path = relpathperm(rnode, forknum); if (segno > 0) +#if PG_VERSION_NUM < 180000 f.rel_path = psprintf("%s.%u", rel_path, segno); +#else + f.rel_path = psprintf("%s.%u", rel_path.str, segno); +#endif else +#if PG_VERSION_NUM < 180000 f.rel_path = rel_path; +#else + f.rel_path = pstrdup(rel_path.str); +#endif f.external_dir_num = 0; @@ -2554,7 +2566,9 @@ process_block_change(ForkNumber forknum, RelFileNode rnode, BlockNumber blkno) if (segno > 0) pg_free(f.rel_path); +#if PG_VERSION_NUM < 180000 pg_free(rel_path); +#endif } diff --git a/src/stream.c b/src/stream.c index 77453e99..1786b4e9 100644 --- a/src/stream.c +++ b/src/stream.c @@ -164,6 +164,11 @@ checkpoint_timeout(PGconn *backup_conn) * CreateReplicationSlot_compat() -- wrapper for CreateReplicationSlot() used in StreamLog() * src/bin/pg_basebackup/streamutil.c * CreateReplicationSlot() has different signatures on different PG versions: + * PG 18 + * bool + * CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin, + * bool is_temporary, bool is_physical, bool reserve_wal, + * bool slot_exists_ok, bool two_phase, bool failover) * PG 15 * bool * CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin, @@ -188,7 +193,10 @@ CreateReplicationSlot_compat(PGconn *conn, const char *slot_name, const char *pl bool is_temporary, bool is_physical, bool slot_exists_ok) { -#if PG_VERSION_NUM >= 150000 +#if PG_VERSION_NUM >= 180000 + return CreateReplicationSlot(conn, slot_name, plugin, is_temporary, is_physical, + /* reserve_wal = */ true, slot_exists_ok, /* two_phase = */ false, /* failover = */ false); +#elif PG_VERSION_NUM >= 150000 return CreateReplicationSlot(conn, slot_name, plugin, is_temporary, is_physical, /* reserve_wal = */ true, slot_exists_ok, /* two_phase = */ false); #elif PG_VERSION_NUM >= 110000 diff --git a/src/utils/pgut.c b/src/utils/pgut.c index 9559fa64..4980f8fd 100644 --- a/src/utils/pgut.c +++ b/src/utils/pgut.c @@ -54,7 +54,9 @@ static void on_before_exec(PGconn *conn, PGcancel *thread_cancel_conn); static void on_after_exec(PGcancel *thread_cancel_conn); static void on_interrupt(void); static void on_cleanup(void); +#if PG_VERSION_NUM < 180000 static pqsigfunc oldhandler = NULL; +#endif static char ** pgut_pgfnames(const char *path, bool strict); static void pgut_pgfnames_cleanup(char **filenames); @@ -819,8 +821,9 @@ on_interrupt(void) if (in_password) { on_cleanup(); - +#if PG_VERSION_NUM < 180000 pqsignal(SIGINT, oldhandler); +#endif kill(0, SIGINT); } @@ -1062,7 +1065,11 @@ handle_interrupt(SIGNAL_ARGS) static void init_cancel_handler(void) { +#if PG_VERSION_NUM < 180000 oldhandler = pqsignal(SIGINT, handle_interrupt); +#else + pqsignal(SIGINT, handle_interrupt); +#endif pqsignal(SIGQUIT, handle_interrupt); pqsignal(SIGTERM, handle_interrupt); pqsignal(SIGPIPE, handle_interrupt);