Kill pg_basebackup background process when exiting
If an error occurs in the foreground (backup) process of pg_basebackup, and we exit in a controlled way, the background process (streaming xlog process) would stay around and keep streaming.
This commit is contained in:
parent
1c9acd5c86
commit
63ab2befe0
|
@ -76,6 +76,7 @@ static PQExpBuffer recoveryconfcontents = NULL;
|
||||||
|
|
||||||
/* Function headers */
|
/* Function headers */
|
||||||
static void usage(void);
|
static void usage(void);
|
||||||
|
static void disconnect_and_exit(int code);
|
||||||
static void verify_dir_is_empty_or_create(char *dirname);
|
static void verify_dir_is_empty_or_create(char *dirname);
|
||||||
static void progress_report(int tablespacenum, const char *filename, bool force);
|
static void progress_report(int tablespacenum, const char *filename, bool force);
|
||||||
|
|
||||||
|
@ -88,6 +89,26 @@ static void BaseBackup(void);
|
||||||
static bool reached_end_position(XLogRecPtr segendpos, uint32 timeline,
|
static bool reached_end_position(XLogRecPtr segendpos, uint32 timeline,
|
||||||
bool segment_finished);
|
bool segment_finished);
|
||||||
|
|
||||||
|
|
||||||
|
static void disconnect_and_exit(int code)
|
||||||
|
{
|
||||||
|
if (conn != NULL)
|
||||||
|
PQfinish(conn);
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
|
/*
|
||||||
|
* On windows, our background thread dies along with the process.
|
||||||
|
* But on Unix, if we have started a subprocess, we want to kill
|
||||||
|
* it off so it doesn't remain running trying to stream data.
|
||||||
|
*/
|
||||||
|
if (bgchild> 0)
|
||||||
|
kill(bgchild, SIGTERM);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
exit(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBZ
|
#ifdef HAVE_LIBZ
|
||||||
static const char *
|
static const char *
|
||||||
get_gz_error(gzFile gzf)
|
get_gz_error(gzFile gzf)
|
||||||
|
|
|
@ -45,6 +45,13 @@ static void StreamLog();
|
||||||
static bool stop_streaming(XLogRecPtr segendpos, uint32 timeline,
|
static bool stop_streaming(XLogRecPtr segendpos, uint32 timeline,
|
||||||
bool segment_finished);
|
bool segment_finished);
|
||||||
|
|
||||||
|
#define disconnect_and_exit(code) \
|
||||||
|
{ \
|
||||||
|
if (conn != NULL) PQfinish(conn); \
|
||||||
|
exit(code); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
usage(void)
|
usage(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,10 +11,4 @@ extern char *replication_slot;
|
||||||
/* Connection kept global so we can disconnect easily */
|
/* Connection kept global so we can disconnect easily */
|
||||||
extern PGconn *conn;
|
extern PGconn *conn;
|
||||||
|
|
||||||
#define disconnect_and_exit(code) \
|
|
||||||
{ \
|
|
||||||
if (conn != NULL) PQfinish(conn); \
|
|
||||||
exit(code); \
|
|
||||||
}
|
|
||||||
|
|
||||||
extern PGconn *GetConnection(void);
|
extern PGconn *GetConnection(void);
|
||||||
|
|
Loading…
Reference in New Issue