Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 39c23c1

Browse filesBrowse files
committed
pg_upgrade: generate check error for left-over new tablespace
Previously, if pg_upgrade failed, and the user recreated the cluster but did not remove the new cluster tablespace directory, a later pg_upgrade would fail since the new tablespace directory would already exists. This adds error reporting for this during check. Reported-by: Justin Pryzby Discussion: https://postgr.es/m/20200925005531.GJ23631@telsasoft.com Backpatch-through: 9.5
1 parent ee59f66 commit 39c23c1
Copy full SHA for 39c23c1

File tree

Expand file treeCollapse file tree

1 file changed

+40
-0
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+40
-0
lines changed

‎src/bin/pg_upgrade/check.c

Copy file name to clipboardExpand all lines: src/bin/pg_upgrade/check.c
+40Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster);
2626
static void check_for_reg_data_type_usage(ClusterInfo *cluster);
2727
static void check_for_jsonb_9_4_usage(ClusterInfo *cluster);
2828
static void check_for_pg_role_prefix(ClusterInfo *cluster);
29+
static void check_for_new_tablespace_dir(ClusterInfo *new_cluster);
2930
static void get_bin_version(ClusterInfo *cluster);
3031
static char *get_canonical_locale_name(int category, const char *locale);
3132

@@ -143,6 +144,8 @@ check_new_cluster(void)
143144
check_is_install_user(&new_cluster);
144145

145146
check_for_prepared_transactions(&new_cluster);
147+
148+
check_for_new_tablespace_dir(&new_cluster);
146149
}
147150

148151

@@ -487,6 +490,43 @@ create_script_for_cluster_analyze(char **analyze_script_file_name)
487490
}
488491

489492

493+
/*
494+
* A previous run of pg_upgrade might have failed and the new cluster
495+
* directory recreated, but they might have forgotten to remove
496+
* the new cluster's tablespace directories. Therefore, check that
497+
* new cluster tablespace directories do not already exist. If
498+
* they do, it would cause an error while restoring global objects.
499+
* This allows the failure to be detected at check time, rather than
500+
* during schema restore.
501+
*
502+
* Note, v8.4 has no tablespace_suffix, which is fine so long as the
503+
* version being upgraded *to* has a suffix, since it's not allowed
504+
* to pg_upgrade from a version to the same version if tablespaces are
505+
* in use.
506+
*/
507+
static void
508+
check_for_new_tablespace_dir(ClusterInfo *new_cluster)
509+
{
510+
char new_tablespace_dir[MAXPGPATH];
511+
512+
prep_status("Checking for new cluster tablespace directories");
513+
514+
for (int tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
515+
{
516+
struct stat statbuf;
517+
518+
snprintf(new_tablespace_dir, MAXPGPATH, "%s%s",
519+
os_info.old_tablespaces[tblnum],
520+
new_cluster->tablespace_suffix);
521+
522+
if (stat(new_tablespace_dir, &statbuf) == 0 || errno != ENOENT)
523+
pg_fatal("new cluster tablespace directory already exists: \"%s\"\n",
524+
new_tablespace_dir);
525+
}
526+
527+
check_ok();
528+
}
529+
490530
/*
491531
* create_script_for_old_cluster_deletion()
492532
*

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.