1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-30 11:03:19 +03:00

pg_upgrade: detect stale postmaster.pid lock files

If the postmaster.pid lock file exists, try starting/stopping the
cluster to check if the lock file is valid.

Per request from Tom.
This commit is contained in:
Bruce Momjian
2013-01-24 15:20:11 -05:00
parent 74ebba84ae
commit a9ceaa53be
5 changed files with 54 additions and 30 deletions

View File

@ -48,7 +48,7 @@ static void prepare_new_databases(void);
static void create_new_objects(void);
static void copy_clog_xlog_xid(void);
static void set_frozenxids(void);
static void setup(char *argv0, bool live_check);
static void setup(char *argv0, bool *live_check);
static void cleanup(void);
ClusterInfo old_cluster,
@ -80,9 +80,9 @@ main(int argc, char **argv)
adjust_data_dir(&old_cluster);
adjust_data_dir(&new_cluster);
output_check_banner(&live_check);
setup(argv[0], &live_check);
setup(argv[0], live_check);
output_check_banner(live_check);
check_cluster_versions();
@ -95,7 +95,7 @@ main(int argc, char **argv)
/* -- NEW -- */
start_postmaster(&new_cluster);
start_postmaster(&new_cluster, true);
check_new_cluster();
report_clusters_compatible();
@ -116,7 +116,7 @@ main(int argc, char **argv)
/* New now using xids of the old system */
/* -- NEW -- */
start_postmaster(&new_cluster);
start_postmaster(&new_cluster, true);
prepare_new_databases();
@ -177,7 +177,7 @@ main(int argc, char **argv)
static void
setup(char *argv0, bool live_check)
setup(char *argv0, bool *live_check)
{
char exec_path[MAXPGPATH]; /* full path to my executable */
@ -189,15 +189,39 @@ setup(char *argv0, bool live_check)
verify_directories();
/* no postmasters should be running */
if (!live_check && is_server_running(old_cluster.pgdata))
pg_log(PG_FATAL, "There seems to be a postmaster servicing the old cluster.\n"
"Please shutdown that postmaster and try again.\n");
/* no postmasters should be running, except for a live check */
if (pid_lock_file_exists(old_cluster.pgdata))
{
/*
* If we have a postmaster.pid file, try to start the server. If
* it starts, the pid file was stale, so stop the server. If it
* doesn't start, assume the server is running. If the pid file
* is left over from a server crash, this also allows any committed
* transactions stored in the WAL to be replayed so they are not
* lost, because WAL files are not transfered from old to new
* servers.
*/
if (start_postmaster(&old_cluster, false))
stop_postmaster(false);
else
{
if (!user_opts.check)
pg_log(PG_FATAL, "There seems to be a postmaster servicing the old cluster.\n"
"Please shutdown that postmaster and try again.\n");
else
*live_check = true;
}
}
/* same goes for the new postmaster */
if (is_server_running(new_cluster.pgdata))
pg_log(PG_FATAL, "There seems to be a postmaster servicing the new cluster.\n"
if (pid_lock_file_exists(new_cluster.pgdata))
{
if (start_postmaster(&new_cluster, false))
stop_postmaster(false);
else
pg_log(PG_FATAL, "There seems to be a postmaster servicing the new cluster.\n"
"Please shutdown that postmaster and try again.\n");
}
/* get path to pg_upgrade executable */
if (find_my_exec(argv0, exec_path) < 0)