mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-04 00:02:52 -05:00 
			
		
		
		
	In pg_upgrade, use the new postmaster -C option to get the real data
directory, for config-only directory installs. Only works for PG 9.2+ servers.
This commit is contained in:
		
							parent
							
								
									a3996754cc
								
							
						
					
					
						commit
						caa1054df8
					
				@ -112,10 +112,12 @@ parseCommandLine(int argc, char *argv[])
 | 
			
		||||
 | 
			
		||||
			case 'd':
 | 
			
		||||
				old_cluster.pgdata = pg_strdup(optarg);
 | 
			
		||||
				old_cluster.pgconfig = pg_strdup(optarg);
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'D':
 | 
			
		||||
				new_cluster.pgdata = pg_strdup(optarg);
 | 
			
		||||
				new_cluster.pgconfig = pg_strdup(optarg);
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'g':
 | 
			
		||||
@ -319,3 +321,61 @@ check_required_directory(char **dirpath, char *envVarName,
 | 
			
		||||
#endif
 | 
			
		||||
		(*dirpath)[strlen(*dirpath) - 1] = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * adjust_data_dir
 | 
			
		||||
 *
 | 
			
		||||
 * If a configuration-only directory was specified, find the real data dir
 | 
			
		||||
 * by quering the running server.  This has limited checking because we
 | 
			
		||||
 * can't check for a running server because we can't find postmaster.pid.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
adjust_data_dir(ClusterInfo *cluster)
 | 
			
		||||
{
 | 
			
		||||
	char		filename[MAXPGPATH];
 | 
			
		||||
	char		cmd[MAXPGPATH], cmd_output[MAX_STRING];
 | 
			
		||||
	FILE	   *fd, *output;
 | 
			
		||||
 | 
			
		||||
	/* If there is no postgresql.conf, it can't be a config-only dir */
 | 
			
		||||
	snprintf(filename, sizeof(filename), "%s/postgresql.conf", cluster->pgconfig);
 | 
			
		||||
	if ((fd = fopen(filename, "r")) == NULL)
 | 
			
		||||
		return;
 | 
			
		||||
	fclose(fd);
 | 
			
		||||
 | 
			
		||||
	/* If PG_VERSION exists, it can't be a config-only dir */
 | 
			
		||||
	snprintf(filename, sizeof(filename), "%s/PG_VERSION", cluster->pgconfig);
 | 
			
		||||
	if ((fd = fopen(filename, "r")) != NULL)
 | 
			
		||||
	{
 | 
			
		||||
		fclose(fd);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Must be a configuration directory, so find the real data directory. */
 | 
			
		||||
 | 
			
		||||
	prep_status("Finding the real data directory for the %s cluster",
 | 
			
		||||
				CLUSTER_NAME(cluster));
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * We don't have a data directory yet, so we can't check the PG
 | 
			
		||||
	 * version, so this might fail --- only works for PG 9.2+.   If this
 | 
			
		||||
	 * fails, pg_upgrade will fail anyway because the data files will not
 | 
			
		||||
	 * be found.
 | 
			
		||||
	 */
 | 
			
		||||
	snprintf(cmd, sizeof(cmd), "\"%s/postmaster\" -D \"%s\" -C data_directory",
 | 
			
		||||
			 cluster->bindir, cluster->pgconfig);
 | 
			
		||||
 | 
			
		||||
	if ((output = popen(cmd, "r")) == NULL ||
 | 
			
		||||
		fgets(cmd_output, sizeof(cmd_output), output) == NULL)
 | 
			
		||||
		pg_log(PG_FATAL, "Could not get data directory using %s: %s\n",
 | 
			
		||||
		cmd, getErrorText(errno));
 | 
			
		||||
 | 
			
		||||
	pclose(output);
 | 
			
		||||
 | 
			
		||||
	/* Remove trailing newline */
 | 
			
		||||
	if (strchr(cmd_output, '\n') != NULL)
 | 
			
		||||
		*strchr(cmd_output, '\n') = '\0';
 | 
			
		||||
 | 
			
		||||
	cluster->pgdata = pg_strdup(cmd_output);
 | 
			
		||||
 | 
			
		||||
	check_ok();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -68,6 +68,9 @@ main(int argc, char **argv)
 | 
			
		||||
 | 
			
		||||
	parseCommandLine(argc, argv);
 | 
			
		||||
 | 
			
		||||
	adjust_data_dir(&old_cluster);
 | 
			
		||||
	adjust_data_dir(&new_cluster);
 | 
			
		||||
 | 
			
		||||
	output_check_banner(&live_check);
 | 
			
		||||
 | 
			
		||||
	setup(argv[0], live_check);
 | 
			
		||||
 | 
			
		||||
@ -187,6 +187,7 @@ typedef struct
 | 
			
		||||
	ControlData controldata;	/* pg_control information */
 | 
			
		||||
	DbInfoArr	dbarr;			/* dbinfos array */
 | 
			
		||||
	char	   *pgdata;			/* pathname for cluster's $PGDATA directory */
 | 
			
		||||
	char	   *pgconfig;		/* pathname for cluster's config file directory */
 | 
			
		||||
	char	   *bindir;			/* pathname for cluster's executable directory */
 | 
			
		||||
	unsigned short port;		/* port number where postmaster is waiting */
 | 
			
		||||
	uint32		major_version;	/* PG_VERSION of cluster */
 | 
			
		||||
@ -361,6 +362,7 @@ void print_maps(FileNameMap *maps, int n,
 | 
			
		||||
/* option.c */
 | 
			
		||||
 | 
			
		||||
void		parseCommandLine(int argc, char *argv[]);
 | 
			
		||||
void		adjust_data_dir(ClusterInfo *cluster);
 | 
			
		||||
 | 
			
		||||
/* relfilenode.c */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -169,7 +169,7 @@ start_postmaster(ClusterInfo *cluster)
 | 
			
		||||
	snprintf(cmd, sizeof(cmd),
 | 
			
		||||
			 SYSTEMQUOTE "\"%s/pg_ctl\" -w -l \"%s\" -D \"%s\" "
 | 
			
		||||
			 "-o \"-p %d %s\" start >> \"%s\" 2>&1" SYSTEMQUOTE,
 | 
			
		||||
			 cluster->bindir, log_opts.filename2, cluster->pgdata, cluster->port,
 | 
			
		||||
			 cluster->bindir, log_opts.filename2, cluster->pgconfig, cluster->port,
 | 
			
		||||
			 (cluster->controldata.cat_ver >=
 | 
			
		||||
			  BINARY_UPGRADE_SERVER_FLAG_CAT_VER) ? "-b" :
 | 
			
		||||
			 "-c autovacuum=off -c autovacuum_freeze_max_age=2000000000",
 | 
			
		||||
@ -208,17 +208,17 @@ stop_postmaster(bool fast)
 | 
			
		||||
{
 | 
			
		||||
	char		cmd[MAXPGPATH];
 | 
			
		||||
	const char *bindir;
 | 
			
		||||
	const char *datadir;
 | 
			
		||||
	const char *configdir;
 | 
			
		||||
 | 
			
		||||
	if (os_info.running_cluster == &old_cluster)
 | 
			
		||||
	{
 | 
			
		||||
		bindir = old_cluster.bindir;
 | 
			
		||||
		datadir = old_cluster.pgdata;
 | 
			
		||||
		configdir = old_cluster.pgconfig;
 | 
			
		||||
	}
 | 
			
		||||
	else if (os_info.running_cluster == &new_cluster)
 | 
			
		||||
	{
 | 
			
		||||
		bindir = new_cluster.bindir;
 | 
			
		||||
		datadir = new_cluster.pgdata;
 | 
			
		||||
		configdir = new_cluster.pgconfig;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
		return;					/* no cluster running */
 | 
			
		||||
@ -226,7 +226,7 @@ stop_postmaster(bool fast)
 | 
			
		||||
	snprintf(cmd, sizeof(cmd),
 | 
			
		||||
			 SYSTEMQUOTE "\"%s/pg_ctl\" -w -l \"%s\" -D \"%s\" %s stop >> "
 | 
			
		||||
			 "\"%s\" 2>&1" SYSTEMQUOTE,
 | 
			
		||||
			 bindir, log_opts.filename2, datadir, fast ? "-m fast" : "",
 | 
			
		||||
			 bindir, log_opts.filename2, configdir, fast ? "-m fast" : "",
 | 
			
		||||
			 log_opts.filename2);
 | 
			
		||||
 | 
			
		||||
	exec_prog(fast ? false : true, "%s", cmd);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user