strlen(PG_TEMP_FILE_PREFIX)) == 0)
continue;
+ /*
+ * Check if the postmaster has signaled us to exit, and abort
+ * with an error in that case. The error handler further up
+ * will call do_pg_abort_backup() for us.
+ */
+ if (walsender_shutdown_requested || walsender_ready_to_stop)
+ ereport(ERROR,
+ (errmsg("shutdown requested, aborting active base backup")));
+
snprintf(pathbuf, MAXPGPATH, "%s/%s", path, de->d_name);
/* Skip postmaster.pid in the data directory */
while ((cnt = fread(buf, 1, Min(sizeof(buf), statbuf->st_size - len), fp)) > 0)
{
/* Send the chunk as a CopyData message */
- pq_putmessage('d', buf, cnt);
+ if (pq_putmessage('d', buf, cnt))
+ ereport(ERROR,
+ (errmsg("base backup could not send data, aborting backup")));
+
len += cnt;
if (len >= statbuf->st_size)
/* Flags set by signal handlers for later service in main loop */
static volatile sig_atomic_t got_SIGHUP = false;
-static volatile sig_atomic_t shutdown_requested = false;
-static volatile sig_atomic_t ready_to_stop = false;
+volatile sig_atomic_t walsender_shutdown_requested = false;
+volatile sig_atomic_t walsender_ready_to_stop = false;
/* Signal handlers */
static void WalSndSigHupHandler(SIGNAL_ARGS);
* When SIGUSR2 arrives, we send all outstanding logs up to the
* shutdown checkpoint record (i.e., the latest record) and exit.
*/
- if (ready_to_stop)
+ if (walsender_ready_to_stop)
{
if (!XLogSend(output_message, &caughtup))
break;
if (caughtup)
- shutdown_requested = true;
+ walsender_shutdown_requested = true;
}
/* Normal exit from the walsender is here */
- if (shutdown_requested)
+ if (walsender_shutdown_requested)
{
/* Inform the standby that XLOG streaming was done */
pq_puttextmessage('C', "COPY 0");
if (!XLogSend(output_message, &caughtup))
break;
- if (caughtup && !got_SIGHUP && !ready_to_stop && !shutdown_requested)
+ if (caughtup && !got_SIGHUP && !walsender_ready_to_stop && !walsender_shutdown_requested)
{
/*
* XXX: We don't really need the periodic wakeups anymore,
static void
WalSndShutdownHandler(SIGNAL_ARGS)
{
- shutdown_requested = true;
+ walsender_shutdown_requested = true;
if (MyWalSnd)
SetLatch(&MyWalSnd->latch);
}
static void
WalSndLastCycleHandler(SIGNAL_ARGS)
{
- ready_to_stop = true;
+ walsender_ready_to_stop = true;
if (MyWalSnd)
SetLatch(&MyWalSnd->latch);
}