v20-0002-pg_createsubscriber-Use-logging.c-log-file-callb.patch
text/plain
Filename: v20-0002-pg_createsubscriber-Use-logging.c-log-file-callb.patch
Type: text/plain
Part: 1
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v20-0002
Subject: pg_createsubscriber: Use logging.c log file callback
| File | + | − |
|---|---|---|
| src/bin/pg_basebackup/pg_createsubscriber.c | 279 | 553 |
From 8e47dcc5fc8fafa5110db7d15c853d71c123a346 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Tue, 31 Mar 2026 14:01:32 +0200
Subject: [PATCH v20 2/4] pg_createsubscriber: Use logging.c log file callback
This reverts commit 6b5b7eae3ae, where a new logging API layer was
introduced locally in pg_createsubscriber. Instead, use the log file
callback introduced in logging.c. This new approach is simpler and
doesn't require any caller changes.
Discussion: https://postgr.es/m/CAEqnbaUthOQARV1dscGvB_EsqC-YfxiM6rWkVDHc+G+f4oSUHw@mail.gmail.com
---
src/bin/pg_basebackup/pg_createsubscriber.c | 832 +++++++-------------
1 file changed, 279 insertions(+), 553 deletions(-)
diff --git a/src/bin/pg_basebackup/pg_createsubscriber.c b/src/bin/pg_basebackup/pg_createsubscriber.c
index 37631f700af..5c5fa2a7633 100644
--- a/src/bin/pg_basebackup/pg_createsubscriber.c
+++ b/src/bin/pg_basebackup/pg_createsubscriber.c
@@ -151,18 +151,6 @@ static void drop_existing_subscription(PGconn *conn, const char *subname,
const char *dbname);
static void get_publisher_databases(struct CreateSubscriberOptions *opt,
bool dbnamespecified);
-static void report_createsub_log(enum pg_log_level, enum pg_log_part,
- const char *pg_restrict fmt,...)
- pg_attribute_printf(3, 4);
-static void report_createsub_log_v(enum pg_log_level level, enum pg_log_part part,
- const char *pg_restrict fmt, va_list args)
- pg_attribute_printf(3, 0);
-pg_noreturn static void report_createsub_fatal(const char *pg_restrict fmt,...)
- pg_attribute_printf(1, 2);
-static void internal_log_file_write(enum pg_log_level level,
- enum pg_log_part part,
- const char *pg_restrict fmt, va_list args)
- pg_attribute_printf(3, 0);
#define WAIT_INTERVAL 1 /* 1 second */
@@ -184,7 +172,6 @@ static pg_prng_state prng_state;
static char *pg_ctl_path = NULL;
static char *pg_resetwal_path = NULL;
-static FILE *internal_log_file_fp = NULL; /* File ptr to log all messages to */
static char logdir[MAXPGPATH]; /* Subdirectory of the user specified logdir
* where the log files are written (if
* specified) */
@@ -196,61 +183,6 @@ static bool recovery_ended = false;
static bool standby_running = false;
static bool recovery_params_set = false;
-/*
- * Report a message with a given log level.
- *
- * Writes to stderr, and also to the log file, if --logdir option was
- * specified.
- */
-static void
-report_createsub_log_v(enum pg_log_level level, enum pg_log_part part,
- const char *pg_restrict fmt, va_list args)
-{
- int save_errno = errno;
-
- if (internal_log_file_fp != NULL)
- {
- /* Output to both stderr and the log file */
- va_list arg_cpy;
-
- va_copy(arg_cpy, args);
- internal_log_file_write(level, part, fmt, arg_cpy);
- va_end(arg_cpy);
- /* Restore errno in case internal_log_file_write changed it */
- errno = save_errno;
- }
- pg_log_generic_v(level, part, fmt, args);
-}
-
-static void
-report_createsub_log(enum pg_log_level level, enum pg_log_part part,
- const char *pg_restrict fmt,...)
-{
- va_list args;
-
- va_start(args, fmt);
-
- report_createsub_log_v(level, part, fmt, args);
-
- va_end(args);
-}
-
-/*
- * Report a fatal error and exit
- */
-static void
-report_createsub_fatal(const char *pg_restrict fmt,...)
-{
- va_list args;
-
- va_start(args, fmt);
-
- report_createsub_log_v(PG_LOG_ERROR, PG_LOG_PRIMARY, fmt, args);
-
- va_end(args);
-
- exit(1);
-}
/*
* Clean up objects created by pg_createsubscriber.
@@ -282,8 +214,7 @@ cleanup_objects_atexit(void)
if (durable_rename(conf_filename, conf_filename_disabled) != 0)
{
/* durable_rename() has already logged something. */
- report_createsub_log(PG_LOG_WARNING, PG_LOG_HINT,
- "A manual removal of the recovery parameters may be required.");
+ pg_log_warning_hint("A manual removal of the recovery parameters may be required.");
}
}
@@ -297,11 +228,9 @@ cleanup_objects_atexit(void)
*/
if (recovery_ended)
{
- report_createsub_log(PG_LOG_WARNING, PG_LOG_PRIMARY,
- "failed after the end of recovery");
- report_createsub_log(PG_LOG_WARNING, PG_LOG_HINT,
- "The target server cannot be used as a physical replica anymore. "
- "You must recreate the physical replica before continuing.");
+ pg_log_warning("failed after the end of recovery");
+ pg_log_warning_hint("The target server cannot be used as a physical replica anymore. "
+ "You must recreate the physical replica before continuing.");
}
for (int i = 0; i < num_dbs; i++)
@@ -331,21 +260,17 @@ cleanup_objects_atexit(void)
*/
if (dbinfo->made_publication)
{
- report_createsub_log(PG_LOG_WARNING, PG_LOG_PRIMARY,
- "publication \"%s\" created in database \"%s\" on primary was left behind",
- dbinfo->pubname,
- dbinfo->dbname);
- report_createsub_log(PG_LOG_WARNING, PG_LOG_HINT,
- "Drop this publication before trying again.");
+ pg_log_warning("publication \"%s\" created in database \"%s\" on primary was left behind",
+ dbinfo->pubname,
+ dbinfo->dbname);
+ pg_log_warning_hint("Drop this publication before trying again.");
}
if (dbinfo->made_replslot)
{
- report_createsub_log(PG_LOG_WARNING, PG_LOG_PRIMARY,
- "replication slot \"%s\" created in database \"%s\" on primary was left behind",
- dbinfo->replslotname,
- dbinfo->dbname);
- report_createsub_log(PG_LOG_WARNING, PG_LOG_HINT,
- "Drop this replication slot soon to avoid retention of WAL files.");
+ pg_log_warning("replication slot \"%s\" created in database \"%s\" on primary was left behind",
+ dbinfo->replslotname,
+ dbinfo->dbname);
+ pg_log_warning_hint("Drop this replication slot soon to avoid retention of WAL files.");
}
}
}
@@ -427,8 +352,7 @@ get_base_conninfo(const char *conninfo, char **dbname)
conn_opts = PQconninfoParse(conninfo, &errmsg);
if (conn_opts == NULL)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not parse connection string: %s", errmsg);
+ pg_log_error("could not parse connection string: %s", errmsg);
PQfreemem(errmsg);
return NULL;
}
@@ -505,15 +429,14 @@ get_exec_path(const char *argv0, const char *progname)
strlcpy(full_path, progname, sizeof(full_path));
if (ret == -1)
- report_createsub_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"",
- progname, "pg_createsubscriber", full_path);
+ pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"",
+ progname, "pg_createsubscriber", full_path);
else
- report_createsub_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s",
- progname, full_path, "pg_createsubscriber");
+ pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s",
+ progname, full_path, "pg_createsubscriber");
}
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "%s path is: %s", progname, exec_path);
+ pg_log_debug("%s path is: %s", progname, exec_path);
return exec_path;
}
@@ -530,16 +453,15 @@ check_data_directory(const char *datadir)
uint32 major_version;
char *version_str;
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "checking if directory \"%s\" is a cluster data directory",
- datadir);
+ pg_log_info("checking if directory \"%s\" is a cluster data directory",
+ datadir);
if (stat(datadir, &statbuf) != 0)
{
if (errno == ENOENT)
- report_createsub_fatal("data directory \"%s\" does not exist", datadir);
+ pg_fatal("data directory \"%s\" does not exist", datadir);
else
- report_createsub_fatal("could not access directory \"%s\": %m", datadir);
+ pg_fatal("could not access directory \"%s\": %m", datadir);
}
/*
@@ -550,11 +472,9 @@ check_data_directory(const char *datadir)
major_version = GET_PG_MAJORVERSION_NUM(get_pg_version(datadir, &version_str));
if (major_version != PG_MAJORVERSION_NUM)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "data directory is of wrong version");
- report_createsub_log(PG_LOG_ERROR, PG_LOG_DETAIL,
- "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\".",
- "PG_VERSION", version_str, PG_MAJORVERSION);
+ pg_log_error("data directory is of wrong version");
+ pg_log_error_detail("File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\".",
+ "PG_VERSION", version_str, PG_MAJORVERSION);
exit(1);
}
}
@@ -637,16 +557,14 @@ store_pub_sub_info(const struct CreateSubscriberOptions *opt,
dbinfo[i].subname = NULL;
/* Other fields will be filled later */
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "publisher(%d): publication: %s ; replication slot: %s ; connection string: %s", i,
- dbinfo[i].pubname ? dbinfo[i].pubname : "(auto)",
- dbinfo[i].replslotname ? dbinfo[i].replslotname : "(auto)",
- dbinfo[i].pubconninfo);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "subscriber(%d): subscription: %s ; connection string: %s, two_phase: %s", i,
- dbinfo[i].subname ? dbinfo[i].subname : "(auto)",
- dbinfo[i].subconninfo,
- dbinfos.two_phase ? "true" : "false");
+ pg_log_debug("publisher(%d): publication: %s ; replication slot: %s ; connection string: %s", i,
+ dbinfo[i].pubname ? dbinfo[i].pubname : "(auto)",
+ dbinfo[i].replslotname ? dbinfo[i].replslotname : "(auto)",
+ dbinfo[i].pubconninfo);
+ pg_log_debug("subscriber(%d): subscription: %s ; connection string: %s, two_phase: %s", i,
+ dbinfo[i].subname ? dbinfo[i].subname : "(auto)",
+ dbinfo[i].subconninfo,
+ dbinfos.two_phase ? "true" : "false");
if (num_pubs > 0)
pubcell = pubcell->next;
@@ -674,9 +592,8 @@ connect_database(const char *conninfo, bool exit_on_error)
conn = PQconnectdb(conninfo);
if (PQstatus(conn) != CONNECTION_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "connection to database failed: %s",
- PQerrorMessage(conn));
+ pg_log_error("connection to database failed: %s",
+ PQerrorMessage(conn));
PQfinish(conn);
if (exit_on_error)
@@ -688,9 +605,8 @@ connect_database(const char *conninfo, bool exit_on_error)
res = PQexec(conn, ALWAYS_SECURE_SEARCH_PATH_SQL);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not clear \"search_path\": %s",
- PQresultErrorMessage(res));
+ pg_log_error("could not clear \"search_path\": %s",
+ PQresultErrorMessage(res));
PQclear(res);
PQfinish(conn);
@@ -729,31 +645,27 @@ get_primary_sysid(const char *conninfo)
PGresult *res;
uint64 sysid;
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "getting system identifier from publisher");
+ pg_log_info("getting system identifier from publisher");
conn = connect_database(conninfo, true);
res = PQexec(conn, "SELECT system_identifier FROM pg_catalog.pg_control_system()");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not get system identifier: %s",
- PQresultErrorMessage(res));
+ pg_log_error("could not get system identifier: %s",
+ PQresultErrorMessage(res));
disconnect_database(conn, true);
}
if (PQntuples(res) != 1)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not get system identifier: got %d rows, expected %d row",
- PQntuples(res), 1);
+ pg_log_error("could not get system identifier: got %d rows, expected %d row",
+ PQntuples(res), 1);
disconnect_database(conn, true);
}
sysid = strtou64(PQgetvalue(res, 0, 0), NULL, 10);
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "system identifier is %" PRIu64 " on publisher", sysid);
+ pg_log_info("system identifier is %" PRIu64 " on publisher", sysid);
PQclear(res);
disconnect_database(conn, false);
@@ -773,17 +685,15 @@ get_standby_sysid(const char *datadir)
bool crc_ok;
uint64 sysid;
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "getting system identifier from subscriber");
+ pg_log_info("getting system identifier from subscriber");
cf = get_controlfile(datadir, &crc_ok);
if (!crc_ok)
- report_createsub_fatal("control file appears to be corrupt");
+ pg_fatal("control file appears to be corrupt");
sysid = cf->system_identifier;
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "system identifier is %" PRIu64 " on subscriber", sysid);
+ pg_log_info("system identifier is %" PRIu64 " on subscriber", sysid);
pg_free(cf);
@@ -805,12 +715,11 @@ modify_subscriber_sysid(const struct CreateSubscriberOptions *opt)
char *out_file;
char *cmd_str;
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "modifying system identifier of subscriber");
+ pg_log_info("modifying system identifier of subscriber");
cf = get_controlfile(subscriber_dir, &crc_ok);
if (!crc_ok)
- report_createsub_fatal("control file appears to be corrupt");
+ pg_fatal("control file appears to be corrupt");
/*
* Select a new system identifier.
@@ -823,23 +732,19 @@ modify_subscriber_sysid(const struct CreateSubscriberOptions *opt)
cf->system_identifier |= getpid() & 0xFFF;
if (dry_run)
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "dry-run: would set system identifier to %" PRIu64 " on subscriber",
- cf->system_identifier);
+ pg_log_info("dry-run: would set system identifier to %" PRIu64 " on subscriber",
+ cf->system_identifier);
else
{
update_controlfile(subscriber_dir, cf, true);
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "system identifier is %" PRIu64 " on subscriber",
- cf->system_identifier);
+ pg_log_info("system identifier is %" PRIu64 " on subscriber",
+ cf->system_identifier);
}
if (dry_run)
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "dry-run: would run pg_resetwal on the subscriber");
+ pg_log_info("dry-run: would run pg_resetwal on the subscriber");
else
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "running pg_resetwal on the subscriber");
+ pg_log_info("running pg_resetwal on the subscriber");
/*
* Redirecting the output to the logfile if specified. Since the output
@@ -856,18 +761,16 @@ modify_subscriber_sysid(const struct CreateSubscriberOptions *opt)
if (opt->log_dir)
pg_free(out_file);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "pg_resetwal command is: %s", cmd_str);
+ pg_log_debug("pg_resetwal command is: %s", cmd_str);
if (!dry_run)
{
int rc = system(cmd_str);
if (rc == 0)
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "successfully reset WAL on the subscriber");
+ pg_log_info("successfully reset WAL on the subscriber");
else
- report_createsub_fatal("could not reset WAL on subscriber: %s", wait_result_to_str(rc));
+ pg_fatal("could not reset WAL on subscriber: %s", wait_result_to_str(rc));
}
pg_free(cf);
@@ -892,17 +795,15 @@ generate_object_name(PGconn *conn)
"WHERE datname = pg_catalog.current_database()");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not obtain database OID: %s",
- PQresultErrorMessage(res));
+ pg_log_error("could not obtain database OID: %s",
+ PQresultErrorMessage(res));
disconnect_database(conn, true);
}
if (PQntuples(res) != 1)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not obtain database OID: got %d rows, expected %d row",
- PQntuples(res), 1);
+ pg_log_error("could not obtain database OID: got %d rows, expected %d row",
+ PQntuples(res), 1);
disconnect_database(conn, true);
}
@@ -942,9 +843,8 @@ find_publication(PGconn *conn, const char *pubname, const char *dbname)
res = PQexec(conn, str->data);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not find publication \"%s\" in database \"%s\": %s",
- pubname, dbname, PQerrorMessage(conn));
+ pg_log_error("could not find publication \"%s\" in database \"%s\": %s",
+ pubname, dbname, PQerrorMessage(conn));
disconnect_database(conn, true);
}
@@ -997,9 +897,8 @@ setup_publisher(struct LogicalRepInfo *dbinfo)
if (find_publication(conn, dbinfo[i].pubname, dbinfo[i].dbname))
{
/* Reuse existing publication on publisher. */
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "use existing publication \"%s\" in database \"%s\"",
- dbinfo[i].pubname, dbinfo[i].dbname);
+ pg_log_info("use existing publication \"%s\" in database \"%s\"",
+ dbinfo[i].pubname, dbinfo[i].dbname);
/* Don't remove pre-existing publication if an error occurs. */
dbinfo[i].made_publication = false;
}
@@ -1037,9 +936,8 @@ setup_publisher(struct LogicalRepInfo *dbinfo)
res = PQexec(conn, "SELECT pg_log_standby_snapshot()");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not write an additional WAL record: %s",
- PQresultErrorMessage(res));
+ pg_log_error("could not write an additional WAL record: %s",
+ PQresultErrorMessage(res));
disconnect_database(conn, true);
}
PQclear(res);
@@ -1064,9 +962,8 @@ server_is_in_recovery(PGconn *conn)
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not obtain recovery progress: %s",
- PQresultErrorMessage(res));
+ pg_log_error("could not obtain recovery progress: %s",
+ PQresultErrorMessage(res));
disconnect_database(conn, true);
}
@@ -1078,46 +975,6 @@ server_is_in_recovery(PGconn *conn)
return ret == 0;
}
-static void
-internal_log_file_write(enum pg_log_level level, enum pg_log_part part,
- const char *pg_restrict fmt, va_list args)
-{
- Assert(internal_log_file_fp);
-
- /* Do nothing if log level is too low. */
- if (level < __pg_log_level)
- return;
-
- /* Add prefix based on the log part and log level */
- switch (part)
- {
- case PG_LOG_PRIMARY:
- switch (level)
- {
- case PG_LOG_ERROR:
- fprintf(internal_log_file_fp, _("error: "));
- break;
- case PG_LOG_WARNING:
- fprintf(internal_log_file_fp, _("warning: "));
- break;
- default:
- break;
- }
- break;
- case PG_LOG_DETAIL:
- fprintf(internal_log_file_fp, _("detail: "));
- break;
- case PG_LOG_HINT:
- fprintf(internal_log_file_fp, _("hint: "));
- break;
- }
-
- vfprintf(internal_log_file_fp, _(fmt), args);
-
- fprintf(internal_log_file_fp, "\n");
- fflush(internal_log_file_fp);
-}
-
/*
* Open a new logfile with proper permissions.
*/
@@ -1129,8 +986,7 @@ logfile_open(const char *filename, const char *mode)
fh = fopen(filename, mode);
if (!fh)
- report_createsub_fatal("could not open log file \"%s\": %m",
- filename);
+ pg_fatal("could not open log file \"%s\": %m", filename);
return fh;
}
@@ -1160,15 +1016,15 @@ make_output_dirs(const char *log_basedir)
len = snprintf(logdir, MAXPGPATH, "%s/%s", log_basedir, timestamp);
if (len >= MAXPGPATH)
- report_createsub_fatal("directory path for log files is too long");
+ pg_fatal("directory path for log files is too long");
/* Create base directory (ignore if exists) */
if (mkdir(log_basedir, pg_dir_create_mode) < 0 && errno != EEXIST)
- report_createsub_fatal("could not create directory \"%s\": %m", log_basedir);
+ pg_fatal("could not create directory \"%s\": %m", log_basedir);
/* Create a timestamp-named subdirectory under the base directory */
if (mkdir(logdir, pg_dir_create_mode) < 0)
- report_createsub_fatal("could not create directory \"%s\": %m", logdir);
+ pg_fatal("could not create directory \"%s\": %m", logdir);
}
/*
@@ -1191,8 +1047,7 @@ check_publisher(const struct LogicalRepInfo *dbinfo)
int max_prepared_transactions;
char *max_slot_wal_keep_size;
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "checking settings on publisher");
+ pg_log_info("checking settings on publisher");
conn = connect_database(dbinfo[0].pubconninfo, true);
@@ -1202,8 +1057,7 @@ check_publisher(const struct LogicalRepInfo *dbinfo)
*/
if (server_is_in_recovery(conn))
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "primary server cannot be in recovery");
+ pg_log_error("primary server cannot be in recovery");
disconnect_database(conn, true);
}
@@ -1229,9 +1083,8 @@ check_publisher(const struct LogicalRepInfo *dbinfo)
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not obtain publisher settings: %s",
- PQresultErrorMessage(res));
+ pg_log_error("could not obtain publisher settings: %s",
+ PQresultErrorMessage(res));
disconnect_database(conn, true);
}
@@ -1245,63 +1098,48 @@ check_publisher(const struct LogicalRepInfo *dbinfo)
PQclear(res);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "publisher: wal_level: %s", wal_level);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "publisher: max_replication_slots: %d", max_repslots);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "publisher: current replication slots: %d", cur_repslots);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "publisher: max_wal_senders: %d", max_walsenders);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "publisher: current wal senders: %d", cur_walsenders);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "publisher: max_prepared_transactions: %d",
- max_prepared_transactions);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "publisher: max_slot_wal_keep_size: %s",
- max_slot_wal_keep_size);
+ pg_log_debug("publisher: wal_level: %s", wal_level);
+ pg_log_debug("publisher: max_replication_slots: %d", max_repslots);
+ pg_log_debug("publisher: current replication slots: %d", cur_repslots);
+ pg_log_debug("publisher: max_wal_senders: %d", max_walsenders);
+ pg_log_debug("publisher: current wal senders: %d", cur_walsenders);
+ pg_log_debug("publisher: max_prepared_transactions: %d",
+ max_prepared_transactions);
+ pg_log_debug("publisher: max_slot_wal_keep_size: %s",
+ max_slot_wal_keep_size);
disconnect_database(conn, false);
if (strcmp(wal_level, "minimal") == 0)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "publisher requires \"wal_level\" >= \"replica\"");
+ pg_log_error("publisher requires \"wal_level\" >= \"replica\"");
failed = true;
}
if (max_repslots - cur_repslots < num_dbs)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "publisher requires %d replication slots, but only %d remain",
- num_dbs, max_repslots - cur_repslots);
- report_createsub_log(PG_LOG_ERROR, PG_LOG_HINT,
- "Increase the configuration parameter \"%s\" to at least %d.",
- "max_replication_slots", cur_repslots + num_dbs);
+ pg_log_error("publisher requires %d replication slots, but only %d remain",
+ num_dbs, max_repslots - cur_repslots);
+ pg_log_error_hint("Increase the configuration parameter \"%s\" to at least %d.",
+ "max_replication_slots", cur_repslots + num_dbs);
failed = true;
}
if (max_walsenders - cur_walsenders < num_dbs)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "publisher requires %d WAL sender processes, but only %d remain",
- num_dbs, max_walsenders - cur_walsenders);
- report_createsub_log(PG_LOG_ERROR, PG_LOG_HINT,
- "Increase the configuration parameter \"%s\" to at least %d.",
- "max_wal_senders", cur_walsenders + num_dbs);
+ pg_log_error("publisher requires %d WAL sender processes, but only %d remain",
+ num_dbs, max_walsenders - cur_walsenders);
+ pg_log_error_hint("Increase the configuration parameter \"%s\" to at least %d.",
+ "max_wal_senders", cur_walsenders + num_dbs);
failed = true;
}
if (max_prepared_transactions != 0 && !dbinfos.two_phase)
{
- report_createsub_log(PG_LOG_WARNING, PG_LOG_PRIMARY,
- "two_phase option will not be enabled for replication slots");
- report_createsub_log(PG_LOG_WARNING, PG_LOG_DETAIL,
- "Subscriptions will be created with the two_phase option disabled. "
- "Prepared transactions will be replicated at COMMIT PREPARED.");
- report_createsub_log(PG_LOG_WARNING, PG_LOG_HINT,
- "You can use the command-line option --enable-two-phase to enable two_phase.");
+ pg_log_warning("two_phase option will not be enabled for replication slots");
+ pg_log_warning_detail("Subscriptions will be created with the two_phase option disabled. "
+ "Prepared transactions will be replicated at COMMIT PREPARED.");
+ pg_log_warning_hint("You can use the command-line option --enable-two-phase to enable two_phase.");
}
/*
@@ -1311,11 +1149,9 @@ check_publisher(const struct LogicalRepInfo *dbinfo)
*/
if (dry_run && (strcmp(max_slot_wal_keep_size, "-1") != 0))
{
- report_createsub_log(PG_LOG_WARNING, PG_LOG_PRIMARY,
- "required WAL could be removed from the publisher");
- report_createsub_log(PG_LOG_WARNING, PG_LOG_HINT,
- "Set the configuration parameter \"%s\" to -1 to ensure that required WAL files are not prematurely removed.",
- "max_slot_wal_keep_size");
+ pg_log_warning("required WAL could be removed from the publisher");
+ pg_log_warning_hint("Set the configuration parameter \"%s\" to -1 to ensure that required WAL files are not prematurely removed.",
+ "max_slot_wal_keep_size");
}
pg_free(wal_level);
@@ -1346,16 +1182,14 @@ check_subscriber(const struct LogicalRepInfo *dbinfo)
int max_replorigins;
int max_wprocs;
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "checking settings on subscriber");
+ pg_log_info("checking settings on subscriber");
conn = connect_database(dbinfo[0].subconninfo, true);
/* The target server must be a standby */
if (!server_is_in_recovery(conn))
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "target server must be a standby");
+ pg_log_error("target server must be a standby");
disconnect_database(conn, true);
}
@@ -1379,9 +1213,8 @@ check_subscriber(const struct LogicalRepInfo *dbinfo)
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not obtain subscriber settings: %s",
- PQresultErrorMessage(res));
+ pg_log_error("could not obtain subscriber settings: %s",
+ PQresultErrorMessage(res));
disconnect_database(conn, true);
}
@@ -1391,16 +1224,12 @@ check_subscriber(const struct LogicalRepInfo *dbinfo)
if (strcmp(PQgetvalue(res, 3, 0), "") != 0)
primary_slot_name = pg_strdup(PQgetvalue(res, 3, 0));
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "subscriber: max_logical_replication_workers: %d",
- max_lrworkers);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "subscriber: max_active_replication_origins: %d", max_replorigins);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "subscriber: max_worker_processes: %d", max_wprocs);
+ pg_log_debug("subscriber: max_logical_replication_workers: %d",
+ max_lrworkers);
+ pg_log_debug("subscriber: max_active_replication_origins: %d", max_replorigins);
+ pg_log_debug("subscriber: max_worker_processes: %d", max_wprocs);
if (primary_slot_name)
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "subscriber: primary_slot_name: %s", primary_slot_name);
+ pg_log_debug("subscriber: primary_slot_name: %s", primary_slot_name);
PQclear(res);
@@ -1408,34 +1237,28 @@ check_subscriber(const struct LogicalRepInfo *dbinfo)
if (max_replorigins < num_dbs)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "subscriber requires %d active replication origins, but only %d remain",
- num_dbs, max_replorigins);
- report_createsub_log(PG_LOG_ERROR, PG_LOG_HINT,
- "Increase the configuration parameter \"%s\" to at least %d.",
- "max_active_replication_origins", num_dbs);
+ pg_log_error("subscriber requires %d active replication origins, but only %d remain",
+ num_dbs, max_replorigins);
+ pg_log_error_hint("Increase the configuration parameter \"%s\" to at least %d.",
+ "max_active_replication_origins", num_dbs);
failed = true;
}
if (max_lrworkers < num_dbs)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "subscriber requires %d logical replication workers, but only %d remain",
- num_dbs, max_lrworkers);
- report_createsub_log(PG_LOG_ERROR, PG_LOG_HINT,
- "Increase the configuration parameter \"%s\" to at least %d.",
- "max_logical_replication_workers", num_dbs);
+ pg_log_error("subscriber requires %d logical replication workers, but only %d remain",
+ num_dbs, max_lrworkers);
+ pg_log_error_hint("Increase the configuration parameter \"%s\" to at least %d.",
+ "max_logical_replication_workers", num_dbs);
failed = true;
}
if (max_wprocs < num_dbs + 1)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "subscriber requires %d worker processes, but only %d remain",
- num_dbs + 1, max_wprocs);
- report_createsub_log(PG_LOG_ERROR, PG_LOG_HINT,
- "Increase the configuration parameter \"%s\" to at least %d.",
- "max_worker_processes", num_dbs + 1);
+ pg_log_error("subscriber requires %d worker processes, but only %d remain",
+ num_dbs + 1, max_wprocs);
+ pg_log_error_hint("Increase the configuration parameter \"%s\" to at least %d.",
+ "max_worker_processes", num_dbs + 1);
failed = true;
}
@@ -1468,22 +1291,19 @@ drop_existing_subscription(PGconn *conn, const char *subname, const char *dbname
appendPQExpBuffer(query, " DROP SUBSCRIPTION %s;", subname);
if (dry_run)
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "dry-run: would drop subscription \"%s\" in database \"%s\"",
- subname, dbname);
+ pg_log_info("dry-run: would drop subscription \"%s\" in database \"%s\"",
+ subname, dbname);
else
{
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "dropping subscription \"%s\" in database \"%s\"",
- subname, dbname);
+ pg_log_info("dropping subscription \"%s\" in database \"%s\"",
+ subname, dbname);
res = PQexec(conn, query->data);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not drop subscription \"%s\": %s",
- subname, PQresultErrorMessage(res));
+ pg_log_error("could not drop subscription \"%s\": %s",
+ subname, PQresultErrorMessage(res));
disconnect_database(conn, true);
}
@@ -1517,9 +1337,8 @@ check_and_drop_existing_subscriptions(PGconn *conn,
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not obtain pre-existing subscriptions: %s",
- PQresultErrorMessage(res));
+ pg_log_error("could not obtain pre-existing subscriptions: %s",
+ PQresultErrorMessage(res));
disconnect_database(conn, true);
}
@@ -1630,8 +1449,7 @@ setup_recovery(const struct LogicalRepInfo *dbinfo, const char *datadir, const c
lsn);
}
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "recovery parameters:\n%s", recoveryconfcontents->data);
+ pg_log_debug("recovery parameters:\n%s", recoveryconfcontents->data);
if (!dry_run)
{
@@ -1643,10 +1461,10 @@ setup_recovery(const struct LogicalRepInfo *dbinfo, const char *datadir, const c
INCLUDED_CONF_FILE);
fd = fopen(conf_filename, "w");
if (fd == NULL)
- report_createsub_fatal("could not open file \"%s\": %m", conf_filename);
+ pg_fatal("could not open file \"%s\": %m", conf_filename);
if (fwrite(recoveryconfcontents->data, recoveryconfcontents->len, 1, fd) != 1)
- report_createsub_fatal("could not write to file \"%s\": %m", conf_filename);
+ pg_fatal("could not write to file \"%s\": %m", conf_filename);
fclose(fd);
recovery_params_set = true;
@@ -1685,11 +1503,9 @@ drop_primary_replication_slot(struct LogicalRepInfo *dbinfo, const char *slotnam
}
else
{
- report_createsub_log(PG_LOG_WARNING, PG_LOG_PRIMARY,
- "could not drop replication slot \"%s\" on primary",
- slotname);
- report_createsub_log(PG_LOG_WARNING, PG_LOG_HINT,
- "Drop this replication slot soon to avoid retention of WAL files.");
+ pg_log_warning("could not drop replication slot \"%s\" on primary",
+ slotname);
+ pg_log_warning_hint("Drop this replication slot soon to avoid retention of WAL files.");
}
}
@@ -1721,11 +1537,9 @@ drop_failover_replication_slots(struct LogicalRepInfo *dbinfo)
}
else
{
- report_createsub_log(PG_LOG_WARNING, PG_LOG_PRIMARY,
- "could not obtain failover replication slot information: %s",
- PQresultErrorMessage(res));
- report_createsub_log(PG_LOG_WARNING, PG_LOG_HINT,
- "Drop the failover replication slots on subscriber soon to avoid retention of WAL files.");
+ pg_log_warning("could not obtain failover replication slot information: %s",
+ PQresultErrorMessage(res));
+ pg_log_warning_hint("Drop the failover replication slots on subscriber soon to avoid retention of WAL files.");
}
PQclear(res);
@@ -1733,10 +1547,8 @@ drop_failover_replication_slots(struct LogicalRepInfo *dbinfo)
}
else
{
- report_createsub_log(PG_LOG_WARNING, PG_LOG_PRIMARY,
- "could not drop failover replication slot");
- report_createsub_log(PG_LOG_WARNING, PG_LOG_HINT,
- "Drop the failover replication slots on subscriber soon to avoid retention of WAL files.");
+ pg_log_warning("could not drop failover replication slot");
+ pg_log_warning_hint("Drop the failover replication slots on subscriber soon to avoid retention of WAL files.");
}
}
@@ -1758,13 +1570,11 @@ create_logical_replication_slot(PGconn *conn, struct LogicalRepInfo *dbinfo)
Assert(conn != NULL);
if (dry_run)
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "dry-run: would create the replication slot \"%s\" in database \"%s\" on publisher",
- slot_name, dbinfo->dbname);
+ pg_log_info("dry-run: would create the replication slot \"%s\" in database \"%s\" on publisher",
+ slot_name, dbinfo->dbname);
else
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "creating the replication slot \"%s\" in database \"%s\" on publisher",
- slot_name, dbinfo->dbname);
+ pg_log_info("creating the replication slot \"%s\" in database \"%s\" on publisher",
+ slot_name, dbinfo->dbname);
slot_name_esc = PQescapeLiteral(conn, slot_name, strlen(slot_name));
@@ -1775,18 +1585,16 @@ create_logical_replication_slot(PGconn *conn, struct LogicalRepInfo *dbinfo)
PQfreemem(slot_name_esc);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "command is: %s", str->data);
+ pg_log_debug("command is: %s", str->data);
if (!dry_run)
{
res = PQexec(conn, str->data);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not create replication slot \"%s\" in database \"%s\": %s",
- slot_name, dbinfo->dbname,
- PQresultErrorMessage(res));
+ pg_log_error("could not create replication slot \"%s\" in database \"%s\": %s",
+ slot_name, dbinfo->dbname,
+ PQresultErrorMessage(res));
PQclear(res);
destroyPQExpBuffer(str);
return NULL;
@@ -1815,13 +1623,11 @@ drop_replication_slot(PGconn *conn, struct LogicalRepInfo *dbinfo,
Assert(conn != NULL);
if (dry_run)
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "dry-run: would drop the replication slot \"%s\" in database \"%s\"",
- slot_name, dbinfo->dbname);
+ pg_log_info("dry-run: would drop the replication slot \"%s\" in database \"%s\"",
+ slot_name, dbinfo->dbname);
else
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "dropping the replication slot \"%s\" in database \"%s\"",
- slot_name, dbinfo->dbname);
+ pg_log_info("dropping the replication slot \"%s\" in database \"%s\"",
+ slot_name, dbinfo->dbname);
slot_name_esc = PQescapeLiteral(conn, slot_name, strlen(slot_name));
@@ -1829,17 +1635,15 @@ drop_replication_slot(PGconn *conn, struct LogicalRepInfo *dbinfo,
PQfreemem(slot_name_esc);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "command is: %s", str->data);
+ pg_log_debug("command is: %s", str->data);
if (!dry_run)
{
res = PQexec(conn, str->data);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not drop replication slot \"%s\" in database \"%s\": %s",
- slot_name, dbinfo->dbname, PQresultErrorMessage(res));
+ pg_log_error("could not drop replication slot \"%s\" in database \"%s\": %s",
+ slot_name, dbinfo->dbname, PQresultErrorMessage(res));
dbinfo->made_replslot = false; /* don't try again. */
}
@@ -1859,32 +1663,25 @@ pg_ctl_status(const char *pg_ctl_cmd, int rc)
{
if (WIFEXITED(rc))
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "pg_ctl failed with exit code %d",
- WEXITSTATUS(rc));
+ pg_log_error("pg_ctl failed with exit code %d", WEXITSTATUS(rc));
}
else if (WIFSIGNALED(rc))
{
#if defined(WIN32)
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "pg_ctl was terminated by exception 0x%X",
- WTERMSIG(rc));
- report_createsub_log(PG_LOG_ERROR, PG_LOG_DETAIL,
- "See C include file \"ntstatus.h\" for a description of the hexadecimal value.");
+ pg_log_error("pg_ctl was terminated by exception 0x%X",
+ WTERMSIG(rc));
+ pg_log_error_detail("See C include file \"ntstatus.h\" for a description of the hexadecimal value.");
#else
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "pg_ctl was terminated by signal %d: %s",
- WTERMSIG(rc), pg_strsignal(WTERMSIG(rc)));
+ pg_log_error("pg_ctl was terminated by signal %d: %s",
+ WTERMSIG(rc), pg_strsignal(WTERMSIG(rc)));
#endif
}
else
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "pg_ctl exited with unrecognized status %d", rc);
+ pg_log_error("pg_ctl exited with unrecognized status %d", rc);
}
- report_createsub_log(PG_LOG_ERROR, PG_LOG_DETAIL,
- "The failed command was: %s", pg_ctl_cmd);
+ pg_log_error_detail("The failed command was: %s", pg_ctl_cmd);
exit(1);
}
}
@@ -1932,14 +1729,12 @@ start_standby_server(const struct CreateSubscriberOptions *opt, bool restricted_
if (opt->log_dir)
appendPQExpBuffer(pg_ctl_cmd, " -l \"%s/%s\"", logdir, SERVER_LOG_FILE_NAME);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "pg_ctl command is: %s", pg_ctl_cmd->data);
+ pg_log_debug("pg_ctl command is: %s", pg_ctl_cmd->data);
rc = system(pg_ctl_cmd->data);
pg_ctl_status(pg_ctl_cmd->data, rc);
standby_running = true;
destroyPQExpBuffer(pg_ctl_cmd);
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "server was started");
+ pg_log_info("server was started");
}
static void
@@ -1950,13 +1745,11 @@ stop_standby_server(const char *datadir)
pg_ctl_cmd = psprintf("\"%s\" stop -D \"%s\" -s", pg_ctl_path,
datadir);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "pg_ctl command is: %s", pg_ctl_cmd);
+ pg_log_debug("pg_ctl command is: %s", pg_ctl_cmd);
rc = system(pg_ctl_cmd);
pg_ctl_status(pg_ctl_cmd, rc);
standby_running = false;
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "server was stopped");
+ pg_log_info("server was stopped");
}
/*
@@ -1975,8 +1768,7 @@ wait_for_end_recovery(const char *conninfo, const struct CreateSubscriberOptions
bool ready = false;
int timer = 0;
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "waiting for the target server to reach the consistent state");
+ pg_log_info("waiting for the target server to reach the consistent state");
conn = connect_database(conninfo, true);
@@ -1994,8 +1786,7 @@ wait_for_end_recovery(const char *conninfo, const struct CreateSubscriberOptions
if (opt->recovery_timeout > 0 && timer >= opt->recovery_timeout)
{
stop_standby_server(subscriber_dir);
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "recovery timed out");
+ pg_log_error("recovery timed out");
disconnect_database(conn, true);
}
@@ -2007,12 +1798,10 @@ wait_for_end_recovery(const char *conninfo, const struct CreateSubscriberOptions
disconnect_database(conn, false);
if (!ready)
- report_createsub_fatal("server did not end recovery");
+ pg_fatal("server did not end recovery");
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "target server reached the consistent state");
- report_createsub_log(PG_LOG_INFO, PG_LOG_HINT,
- "If pg_createsubscriber fails after this point, you must recreate the physical replica before continuing.");
+ pg_log_info("target server reached the consistent state");
+ pg_log_info_hint("If pg_createsubscriber fails after this point, you must recreate the physical replica before continuing.");
}
/*
@@ -2039,9 +1828,8 @@ create_publication(PGconn *conn, struct LogicalRepInfo *dbinfo)
res = PQexec(conn, str->data);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not obtain publication information: %s",
- PQresultErrorMessage(res));
+ pg_log_error("could not obtain publication information: %s",
+ PQresultErrorMessage(res));
disconnect_database(conn, true);
}
@@ -2054,10 +1842,8 @@ create_publication(PGconn *conn, struct LogicalRepInfo *dbinfo)
* pg_createsubscriber_ prefix followed by the exact database oid and
* a random number.
*/
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "publication \"%s\" already exists", dbinfo->pubname);
- report_createsub_log(PG_LOG_ERROR, PG_LOG_HINT,
- "Consider renaming this publication before continuing.");
+ pg_log_error("publication \"%s\" already exists", dbinfo->pubname);
+ pg_log_error_hint("Consider renaming this publication before continuing.");
disconnect_database(conn, true);
}
@@ -2065,28 +1851,24 @@ create_publication(PGconn *conn, struct LogicalRepInfo *dbinfo)
resetPQExpBuffer(str);
if (dry_run)
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "dry-run: would create publication \"%s\" in database \"%s\"",
- dbinfo->pubname, dbinfo->dbname);
+ pg_log_info("dry-run: would create publication \"%s\" in database \"%s\"",
+ dbinfo->pubname, dbinfo->dbname);
else
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "creating publication \"%s\" in database \"%s\"",
- dbinfo->pubname, dbinfo->dbname);
+ pg_log_info("creating publication \"%s\" in database \"%s\"",
+ dbinfo->pubname, dbinfo->dbname);
appendPQExpBuffer(str, "CREATE PUBLICATION %s FOR ALL TABLES",
ipubname_esc);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "command is: %s", str->data);
+ pg_log_debug("command is: %s", str->data);
if (!dry_run)
{
res = PQexec(conn, str->data);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not create publication \"%s\" in database \"%s\": %s",
- dbinfo->pubname, dbinfo->dbname, PQresultErrorMessage(res));
+ pg_log_error("could not create publication \"%s\" in database \"%s\": %s",
+ dbinfo->pubname, dbinfo->dbname, PQresultErrorMessage(res));
disconnect_database(conn, true);
}
PQclear(res);
@@ -2116,29 +1898,25 @@ drop_publication(PGconn *conn, const char *pubname, const char *dbname,
pubname_esc = PQescapeIdentifier(conn, pubname, strlen(pubname));
if (dry_run)
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "dry-run: would drop publication \"%s\" in database \"%s\"",
- pubname, dbname);
+ pg_log_info("dry-run: would drop publication \"%s\" in database \"%s\"",
+ pubname, dbname);
else
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "dropping publication \"%s\" in database \"%s\"",
- pubname, dbname);
+ pg_log_info("dropping publication \"%s\" in database \"%s\"",
+ pubname, dbname);
appendPQExpBuffer(str, "DROP PUBLICATION %s", pubname_esc);
PQfreemem(pubname_esc);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "command is: %s", str->data);
+ pg_log_debug("command is: %s", str->data);
if (!dry_run)
{
res = PQexec(conn, str->data);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not drop publication \"%s\" in database \"%s\": %s",
- pubname, dbname, PQresultErrorMessage(res));
+ pg_log_error("could not drop publication \"%s\" in database \"%s\": %s",
+ pubname, dbname, PQresultErrorMessage(res));
*made_publication = false; /* don't try again. */
/*
@@ -2173,17 +1951,15 @@ check_and_drop_publications(PGconn *conn, struct LogicalRepInfo *dbinfo)
if (drop_all_pubs)
{
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "dropping all existing publications in database \"%s\"",
- dbinfo->dbname);
+ pg_log_info("dropping all existing publications in database \"%s\"",
+ dbinfo->dbname);
/* Fetch all publication names */
res = PQexec(conn, "SELECT pubname FROM pg_catalog.pg_publication;");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not obtain publication information: %s",
- PQresultErrorMessage(res));
+ pg_log_error("could not obtain publication information: %s",
+ PQresultErrorMessage(res));
PQclear(res);
disconnect_database(conn, true);
}
@@ -2206,13 +1982,11 @@ check_and_drop_publications(PGconn *conn, struct LogicalRepInfo *dbinfo)
else
{
if (dry_run)
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "dry-run: would preserve existing publication \"%s\" in database \"%s\"",
- dbinfo->pubname, dbinfo->dbname);
+ pg_log_info("dry-run: would preserve existing publication \"%s\" in database \"%s\"",
+ dbinfo->pubname, dbinfo->dbname);
else
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "preserve existing publication \"%s\" in database \"%s\"",
- dbinfo->pubname, dbinfo->dbname);
+ pg_log_info("preserve existing publication \"%s\" in database \"%s\"",
+ dbinfo->pubname, dbinfo->dbname);
}
}
}
@@ -2246,13 +2020,11 @@ create_subscription(PGconn *conn, const struct LogicalRepInfo *dbinfo)
replslotname_esc = PQescapeLiteral(conn, dbinfo->replslotname, strlen(dbinfo->replslotname));
if (dry_run)
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "dry-run: would create subscription \"%s\" in database \"%s\"",
- dbinfo->subname, dbinfo->dbname);
+ pg_log_info("dry-run: would create subscription \"%s\" in database \"%s\"",
+ dbinfo->subname, dbinfo->dbname);
else
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "creating subscription \"%s\" in database \"%s\"",
- dbinfo->subname, dbinfo->dbname);
+ pg_log_info("creating subscription \"%s\" in database \"%s\"",
+ dbinfo->subname, dbinfo->dbname);
appendPQExpBuffer(str,
"CREATE SUBSCRIPTION %s CONNECTION %s PUBLICATION %s "
@@ -2266,17 +2038,15 @@ create_subscription(PGconn *conn, const struct LogicalRepInfo *dbinfo)
PQfreemem(pubconninfo_esc);
PQfreemem(replslotname_esc);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "command is: %s", str->data);
+ pg_log_debug("command is: %s", str->data);
if (!dry_run)
{
res = PQexec(conn, str->data);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not create subscription \"%s\" in database \"%s\": %s",
- dbinfo->subname, dbinfo->dbname, PQresultErrorMessage(res));
+ pg_log_error("could not create subscription \"%s\" in database \"%s\": %s",
+ dbinfo->subname, dbinfo->dbname, PQresultErrorMessage(res));
disconnect_database(conn, true);
}
PQclear(res);
@@ -2320,17 +2090,15 @@ set_replication_progress(PGconn *conn, const struct LogicalRepInfo *dbinfo, cons
res = PQexec(conn, str->data);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not obtain subscription OID: %s",
- PQresultErrorMessage(res));
+ pg_log_error("could not obtain subscription OID: %s",
+ PQresultErrorMessage(res));
disconnect_database(conn, true);
}
if (PQntuples(res) != 1 && !dry_run)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not obtain subscription OID: got %d rows, expected %d row",
- PQntuples(res), 1);
+ pg_log_error("could not obtain subscription OID: got %d rows, expected %d row",
+ PQntuples(res), 1);
disconnect_database(conn, true);
}
@@ -2354,30 +2122,26 @@ set_replication_progress(PGconn *conn, const struct LogicalRepInfo *dbinfo, cons
originname = psprintf("pg_%u", suboid);
if (dry_run)
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "dry-run: would set the replication progress (node name \"%s\", LSN %s) in database \"%s\"",
- originname, lsnstr, dbinfo->dbname);
+ pg_log_info("dry-run: would set the replication progress (node name \"%s\", LSN %s) in database \"%s\"",
+ originname, lsnstr, dbinfo->dbname);
else
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "setting the replication progress (node name \"%s\", LSN %s) in database \"%s\"",
- originname, lsnstr, dbinfo->dbname);
+ pg_log_info("setting the replication progress (node name \"%s\", LSN %s) in database \"%s\"",
+ originname, lsnstr, dbinfo->dbname);
resetPQExpBuffer(str);
appendPQExpBuffer(str,
"SELECT pg_catalog.pg_replication_origin_advance('%s', '%s')",
originname, lsnstr);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "command is: %s", str->data);
+ pg_log_debug("command is: %s", str->data);
if (!dry_run)
{
res = PQexec(conn, str->data);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not set replication progress for subscription \"%s\": %s",
- dbinfo->subname, PQresultErrorMessage(res));
+ pg_log_error("could not set replication progress for subscription \"%s\": %s",
+ dbinfo->subname, PQresultErrorMessage(res));
disconnect_database(conn, true);
}
PQclear(res);
@@ -2408,27 +2172,23 @@ enable_subscription(PGconn *conn, const struct LogicalRepInfo *dbinfo)
subname = PQescapeIdentifier(conn, dbinfo->subname, strlen(dbinfo->subname));
if (dry_run)
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "dry-run: would enable subscription \"%s\" in database \"%s\"",
- dbinfo->subname, dbinfo->dbname);
+ pg_log_info("dry-run: would enable subscription \"%s\" in database \"%s\"",
+ dbinfo->subname, dbinfo->dbname);
else
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "enabling subscription \"%s\" in database \"%s\"",
- dbinfo->subname, dbinfo->dbname);
+ pg_log_info("enabling subscription \"%s\" in database \"%s\"",
+ dbinfo->subname, dbinfo->dbname);
appendPQExpBuffer(str, "ALTER SUBSCRIPTION %s ENABLE", subname);
- report_createsub_log(PG_LOG_DEBUG, PG_LOG_PRIMARY,
- "command is: %s", str->data);
+ pg_log_debug("command is: %s", str->data);
if (!dry_run)
{
res = PQexec(conn, str->data);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not enable subscription \"%s\": %s",
- dbinfo->subname, PQresultErrorMessage(res));
+ pg_log_error("could not enable subscription \"%s\": %s",
+ dbinfo->subname, PQresultErrorMessage(res));
disconnect_database(conn, true);
}
@@ -2473,9 +2233,7 @@ get_publisher_databases(struct CreateSubscriberOptions *opt,
res = PQexec(conn, "SELECT datname FROM pg_database WHERE datistemplate = false AND datallowconn AND datconnlimit <> -2 ORDER BY 1");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "could not obtain a list of databases: %s",
- PQresultErrorMessage(res));
+ pg_log_error("could not obtain a list of databases: %s", PQresultErrorMessage(res));
PQclear(res);
disconnect_database(conn, true);
}
@@ -2581,11 +2339,9 @@ main(int argc, char **argv)
#ifndef WIN32
if (geteuid() == 0)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "cannot be executed by \"root\"");
- report_createsub_log(PG_LOG_ERROR, PG_LOG_HINT,
- "You must run %s as the PostgreSQL superuser.",
- progname);
+ pg_log_error("cannot be executed by \"root\"");
+ pg_log_error_hint("You must run %s as the PostgreSQL superuser.",
+ progname);
exit(1);
}
#endif
@@ -2607,7 +2363,7 @@ main(int argc, char **argv)
num_dbs++;
}
else
- report_createsub_fatal("database \"%s\" specified more than once for -d/--database", optarg);
+ pg_fatal("database \"%s\" specified more than once for -d/--database", optarg);
break;
case 'D':
subscriber_dir = pg_strdup(optarg);
@@ -2652,7 +2408,7 @@ main(int argc, char **argv)
num_pubs++;
}
else
- report_createsub_fatal("publication \"%s\" specified more than once for --publication", optarg);
+ pg_fatal("publication \"%s\" specified more than once for --publication", optarg);
break;
case 3:
if (!simple_string_list_member(&opt.replslot_names, optarg))
@@ -2661,7 +2417,7 @@ main(int argc, char **argv)
num_replslots++;
}
else
- report_createsub_fatal("replication slot \"%s\" specified more than once for --replication-slot", optarg);
+ pg_fatal("replication slot \"%s\" specified more than once for --replication-slot", optarg);
break;
case 4:
if (!simple_string_list_member(&opt.sub_names, optarg))
@@ -2670,19 +2426,17 @@ main(int argc, char **argv)
num_subs++;
}
else
- report_createsub_fatal("subscription \"%s\" specified more than once for --subscription", optarg);
+ pg_fatal("subscription \"%s\" specified more than once for --subscription", optarg);
break;
case 5:
if (!simple_string_list_member(&opt.objecttypes_to_clean, optarg))
simple_string_list_append(&opt.objecttypes_to_clean, optarg);
else
- report_createsub_fatal("object type \"%s\" specified more than once for --clean", optarg);
+ pg_fatal("object type \"%s\" specified more than once for --clean", optarg);
break;
default:
/* getopt_long already emitted a complaint */
- report_createsub_log(PG_LOG_ERROR, PG_LOG_HINT,
- "Try \"%s --help\" for more information.",
- progname);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
exit(1);
}
}
@@ -2703,12 +2457,9 @@ main(int argc, char **argv)
if (bad_switch)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "options %s and %s cannot be used together",
- bad_switch, "-a/--all");
- report_createsub_log(PG_LOG_ERROR, PG_LOG_HINT,
- "Try \"%s --help\" for more information.",
- progname);
+ pg_log_error("options %s and %s cannot be used together",
+ bad_switch, "-a/--all");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
exit(1);
}
}
@@ -2716,21 +2467,17 @@ main(int argc, char **argv)
/* Any non-option arguments? */
if (optind < argc)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "too many command-line arguments (first is \"%s\")",
- argv[optind]);
- report_createsub_log(PG_LOG_ERROR, PG_LOG_HINT,
- "Try \"%s --help\" for more information.", progname);
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
exit(1);
}
/* Required arguments */
if (subscriber_dir == NULL)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "no subscriber data directory specified");
- report_createsub_log(PG_LOG_ERROR, PG_LOG_HINT,
- "Try \"%s --help\" for more information.", progname);
+ pg_log_error("no subscriber data directory specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
exit(1);
}
@@ -2740,7 +2487,7 @@ main(int argc, char **argv)
char cwd[MAXPGPATH];
if (!getcwd(cwd, MAXPGPATH))
- report_createsub_fatal("could not determine current directory");
+ pg_fatal("could not determine current directory");
opt.socket_dir = pg_strdup(cwd);
canonicalize_path(opt.socket_dir);
}
@@ -2757,16 +2504,15 @@ main(int argc, char **argv)
* identical entries for physical and logical replication. If there is
* not, we would fail anyway.
*/
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "no publisher connection string specified");
- report_createsub_log(PG_LOG_ERROR, PG_LOG_HINT,
- "Try \"%s --help\" for more information.", progname);
+ pg_log_error("no publisher connection string specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
exit(1);
}
if (opt.log_dir != NULL)
{
char *internal_log_file;
+ FILE *internal_log_file_fp;
umask(PG_MODE_MASK_OWNER);
@@ -2787,22 +2533,21 @@ main(int argc, char **argv)
/* logfile_open() will exit if there is an error */
internal_log_file_fp = logfile_open(internal_log_file, "a");
pg_free(internal_log_file);
+
+ pg_logging_set_logfile(internal_log_file_fp);
}
if (dry_run)
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "Executing in dry-run mode.\n"
- "The target directory will not be modified.");
+ pg_log_info("Executing in dry-run mode.\n"
+ "The target directory will not be modified.");
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "validating publisher connection string");
+ pg_log_info("validating publisher connection string");
pub_base_conninfo = get_base_conninfo(opt.pub_conninfo_str,
&dbname_conninfo);
if (pub_base_conninfo == NULL)
exit(1);
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "validating subscriber connection string");
+ pg_log_info("validating subscriber connection string");
sub_base_conninfo = get_sub_conninfo(&opt);
/*
@@ -2819,8 +2564,7 @@ main(int argc, char **argv)
if (opt.database_names.head == NULL)
{
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "no database was specified");
+ pg_log_info("no database was specified");
/*
* Try to obtain the dbname from the publisher conninfo. If dbname
@@ -2831,17 +2575,14 @@ main(int argc, char **argv)
simple_string_list_append(&opt.database_names, dbname_conninfo);
num_dbs++;
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "database name \"%s\" was extracted from the publisher connection string",
- dbname_conninfo);
+ pg_log_info("database name \"%s\" was extracted from the publisher connection string",
+ dbname_conninfo);
}
else
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "no database name specified");
- report_createsub_log(PG_LOG_ERROR, PG_LOG_HINT,
- "Try \"%s --help\" for more information.",
- progname);
+ pg_log_error("no database name specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.",
+ progname);
exit(1);
}
}
@@ -2849,29 +2590,23 @@ main(int argc, char **argv)
/* Number of object names must match number of databases */
if (num_pubs > 0 && num_pubs != num_dbs)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "wrong number of publication names specified");
- report_createsub_log(PG_LOG_ERROR, PG_LOG_DETAIL,
- "The number of specified publication names (%d) must match the number of specified database names (%d).",
- num_pubs, num_dbs);
+ pg_log_error("wrong number of publication names specified");
+ pg_log_error_detail("The number of specified publication names (%d) must match the number of specified database names (%d).",
+ num_pubs, num_dbs);
exit(1);
}
if (num_subs > 0 && num_subs != num_dbs)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "wrong number of subscription names specified");
- report_createsub_log(PG_LOG_ERROR, PG_LOG_DETAIL,
- "The number of specified subscription names (%d) must match the number of specified database names (%d).",
- num_subs, num_dbs);
+ pg_log_error("wrong number of subscription names specified");
+ pg_log_error_detail("The number of specified subscription names (%d) must match the number of specified database names (%d).",
+ num_subs, num_dbs);
exit(1);
}
if (num_replslots > 0 && num_replslots != num_dbs)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "wrong number of replication slot names specified");
- report_createsub_log(PG_LOG_ERROR, PG_LOG_DETAIL,
- "The number of specified replication slot names (%d) must match the number of specified database names (%d).",
- num_replslots, num_dbs);
+ pg_log_error("wrong number of replication slot names specified");
+ pg_log_error_detail("The number of specified replication slot names (%d) must match the number of specified database names (%d).",
+ num_replslots, num_dbs);
exit(1);
}
@@ -2882,11 +2617,9 @@ main(int argc, char **argv)
dbinfos.objecttypes_to_clean |= OBJECTTYPE_PUBLICATIONS;
else
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "invalid object type \"%s\" specified for %s",
- cell->val, "--clean");
- report_createsub_log(PG_LOG_ERROR, PG_LOG_HINT,
- "The valid value is: \"%s\"", "publications");
+ pg_log_error("invalid object type \"%s\" specified for %s",
+ cell->val, "--clean");
+ pg_log_error_hint("The valid value is: \"%s\"", "publications");
exit(1);
}
}
@@ -2917,7 +2650,7 @@ main(int argc, char **argv)
pub_sysid = get_primary_sysid(dbinfos.dbinfo[0].pubconninfo);
sub_sysid = get_standby_sysid(subscriber_dir);
if (pub_sysid != sub_sysid)
- report_createsub_fatal("subscriber data directory is not a copy of the source database cluster");
+ pg_fatal("subscriber data directory is not a copy of the source database cluster");
/* Subscriber PID file */
snprintf(pidfile, MAXPGPATH, "%s/postmaster.pid", subscriber_dir);
@@ -2930,10 +2663,8 @@ main(int argc, char **argv)
*/
if (stat(pidfile, &statbuf) == 0)
{
- report_createsub_log(PG_LOG_ERROR, PG_LOG_PRIMARY,
- "standby server is running");
- report_createsub_log(PG_LOG_ERROR, PG_LOG_HINT,
- "Stop the standby server and try again.");
+ pg_log_error("standby server is running");
+ pg_log_error_hint("Stop the standby server and try again.");
exit(1);
}
@@ -2942,8 +2673,7 @@ main(int argc, char **argv)
* by command-line options). The goal is to avoid connections during the
* transformation steps.
*/
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "starting the standby server with command-line options");
+ pg_log_info("starting the standby server with command-line options");
start_standby_server(&opt, true, false);
/* Check if the standby server is ready for logical replication */
@@ -2959,8 +2689,7 @@ main(int argc, char **argv)
* guarantees it) *before* creating the replication slots in
* setup_publisher().
*/
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "stopping the subscriber");
+ pg_log_info("stopping the subscriber");
stop_standby_server(subscriber_dir);
/* Create the required objects for each database on publisher */
@@ -2974,8 +2703,7 @@ main(int argc, char **argv)
* until accepting connections. We don't want to start logical replication
* during setup.
*/
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "starting the subscriber");
+ pg_log_info("starting the subscriber");
start_standby_server(&opt, true, true);
/* Waiting the subscriber to be promoted */
@@ -2996,8 +2724,7 @@ main(int argc, char **argv)
drop_failover_replication_slots(dbinfos.dbinfo);
/* Stop the subscriber */
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "stopping the subscriber");
+ pg_log_info("stopping the subscriber");
stop_standby_server(subscriber_dir);
/* Change system identifier from subscriber */
@@ -3005,8 +2732,7 @@ main(int argc, char **argv)
success = true;
- report_createsub_log(PG_LOG_INFO, PG_LOG_PRIMARY,
- "Done!");
+ pg_log_info("Done!");
return 0;
}
--
2.53.0