mirror of
https://github.com/postgres/postgres.git
synced 2025-05-03 22:24:49 +03:00
Adjust pg_upgrade check for pg_upgrade_support to happen after the
binary directory has been validated. Backpatch to 9.1. Dan McGee
This commit is contained in:
parent
3ccd16c5a9
commit
c6635bd7ba
@ -19,6 +19,7 @@ static void check_is_super_user(ClusterInfo *cluster);
|
|||||||
static void check_for_prepared_transactions(ClusterInfo *cluster);
|
static void check_for_prepared_transactions(ClusterInfo *cluster);
|
||||||
static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster);
|
static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster);
|
||||||
static void check_for_reg_data_type_usage(ClusterInfo *cluster);
|
static void check_for_reg_data_type_usage(ClusterInfo *cluster);
|
||||||
|
static void check_for_support_lib(ClusterInfo *cluster);
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -245,21 +246,7 @@ check_cluster_versions(void)
|
|||||||
void
|
void
|
||||||
check_cluster_compatibility(bool live_check)
|
check_cluster_compatibility(bool live_check)
|
||||||
{
|
{
|
||||||
char libfile[MAXPGPATH];
|
check_for_support_lib(&new_cluster);
|
||||||
FILE *lib_test;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Test pg_upgrade_support.so is in the proper place. We cannot copy it
|
|
||||||
* ourselves because install directories are typically root-owned.
|
|
||||||
*/
|
|
||||||
snprintf(libfile, sizeof(libfile), "%s/pg_upgrade_support%s", new_cluster.libpath,
|
|
||||||
DLSUFFIX);
|
|
||||||
|
|
||||||
if ((lib_test = fopen(libfile, "r")) == NULL)
|
|
||||||
pg_log(PG_FATAL,
|
|
||||||
"pg_upgrade_support%s must be created and installed in %s\n", DLSUFFIX, libfile);
|
|
||||||
else
|
|
||||||
fclose(lib_test);
|
|
||||||
|
|
||||||
/* get/check pg_control data of servers */
|
/* get/check pg_control data of servers */
|
||||||
get_control_data(&old_cluster, live_check);
|
get_control_data(&old_cluster, live_check);
|
||||||
@ -730,3 +717,42 @@ check_for_reg_data_type_usage(ClusterInfo *cluster)
|
|||||||
else
|
else
|
||||||
check_ok();
|
check_ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Test pg_upgrade_support.so is in the proper place. We cannot copy it
|
||||||
|
* ourselves because install directories are typically root-owned.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
check_for_support_lib(ClusterInfo *cluster)
|
||||||
|
{
|
||||||
|
char cmd[MAXPGPATH];
|
||||||
|
char libdir[MAX_STRING];
|
||||||
|
char libfile[MAXPGPATH];
|
||||||
|
FILE *lib_test;
|
||||||
|
FILE *output;
|
||||||
|
|
||||||
|
snprintf(cmd, sizeof(cmd), "\"%s/pg_config\" --pkglibdir", cluster->bindir);
|
||||||
|
|
||||||
|
if ((output = popen(cmd, "r")) == NULL)
|
||||||
|
pg_log(PG_FATAL, "Could not get pkglibdir data: %s\n",
|
||||||
|
getErrorText(errno));
|
||||||
|
|
||||||
|
fgets(libdir, sizeof(libdir), output);
|
||||||
|
|
||||||
|
pclose(output);
|
||||||
|
|
||||||
|
/* Remove trailing newline */
|
||||||
|
if (strchr(libdir, '\n') != NULL)
|
||||||
|
*strchr(libdir, '\n') = '\0';
|
||||||
|
|
||||||
|
snprintf(libfile, sizeof(libfile), "%s/pg_upgrade_support%s", libdir,
|
||||||
|
DLSUFFIX);
|
||||||
|
|
||||||
|
if ((lib_test = fopen(libfile, "r")) == NULL)
|
||||||
|
pg_log(PG_FATAL,
|
||||||
|
"The pg_upgrade_support module must be created and installed in the %s cluster.\n",
|
||||||
|
CLUSTER_NAME(cluster));
|
||||||
|
|
||||||
|
fclose(lib_test);
|
||||||
|
}
|
||||||
|
@ -19,8 +19,6 @@
|
|||||||
static void usage(void);
|
static void usage(void);
|
||||||
static void validateDirectoryOption(char **dirpath,
|
static void validateDirectoryOption(char **dirpath,
|
||||||
char *envVarName, char *cmdLineOption, char *description);
|
char *envVarName, char *cmdLineOption, char *description);
|
||||||
static void get_pkglibdirs(void);
|
|
||||||
static char *get_pkglibdir(const char *bindir);
|
|
||||||
|
|
||||||
|
|
||||||
UserOpts user_opts;
|
UserOpts user_opts;
|
||||||
@ -213,8 +211,6 @@ parseCommandLine(int argc, char *argv[])
|
|||||||
"old cluster data resides");
|
"old cluster data resides");
|
||||||
validateDirectoryOption(&new_cluster.pgdata, "NEWDATADIR", "-D",
|
validateDirectoryOption(&new_cluster.pgdata, "NEWDATADIR", "-D",
|
||||||
"new cluster data resides");
|
"new cluster data resides");
|
||||||
|
|
||||||
get_pkglibdirs();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -316,44 +312,3 @@ validateDirectoryOption(char **dirpath,
|
|||||||
#endif
|
#endif
|
||||||
(*dirpath)[strlen(*dirpath) - 1] = 0;
|
(*dirpath)[strlen(*dirpath) - 1] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
get_pkglibdirs(void)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* we do not need to know the libpath in the old cluster, and might not
|
|
||||||
* have a working pg_config to ask for it anyway.
|
|
||||||
*/
|
|
||||||
old_cluster.libpath = NULL;
|
|
||||||
new_cluster.libpath = get_pkglibdir(new_cluster.bindir);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static char *
|
|
||||||
get_pkglibdir(const char *bindir)
|
|
||||||
{
|
|
||||||
char cmd[MAXPGPATH];
|
|
||||||
char bufin[MAX_STRING];
|
|
||||||
FILE *output;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
snprintf(cmd, sizeof(cmd), "\"%s/pg_config\" --pkglibdir", bindir);
|
|
||||||
|
|
||||||
if ((output = popen(cmd, "r")) == NULL)
|
|
||||||
pg_log(PG_FATAL, "Could not get pkglibdir data: %s\n",
|
|
||||||
getErrorText(errno));
|
|
||||||
|
|
||||||
fgets(bufin, sizeof(bufin), output);
|
|
||||||
|
|
||||||
if (output)
|
|
||||||
pclose(output);
|
|
||||||
|
|
||||||
/* Remove trailing newline */
|
|
||||||
i = strlen(bufin) - 1;
|
|
||||||
|
|
||||||
if (bufin[i] == '\n')
|
|
||||||
bufin[i] = '\0';
|
|
||||||
|
|
||||||
return pg_strdup(bufin);
|
|
||||||
}
|
|
||||||
|
@ -185,7 +185,6 @@ typedef struct
|
|||||||
uint32 major_version; /* PG_VERSION of cluster */
|
uint32 major_version; /* PG_VERSION of cluster */
|
||||||
char major_version_str[64]; /* string PG_VERSION of cluster */
|
char major_version_str[64]; /* string PG_VERSION of cluster */
|
||||||
Oid pg_database_oid; /* OID of pg_database relation */
|
Oid pg_database_oid; /* OID of pg_database relation */
|
||||||
char *libpath; /* pathname for cluster's pkglibdir */
|
|
||||||
char *tablespace_suffix; /* directory specification */
|
char *tablespace_suffix; /* directory specification */
|
||||||
} ClusterInfo;
|
} ClusterInfo;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user