diff --git a/contrib/pg_upgrade/pg_upgrade.c b/contrib/pg_upgrade/pg_upgrade.c index 773bb07e04eb9c2a3384ff68fc9398fe5cbd7313..c7386cdd3d3bc74b60fb57fb5cd0f6353988c10a 100644 --- a/contrib/pg_upgrade/pg_upgrade.c +++ b/contrib/pg_upgrade/pg_upgrade.c @@ -363,22 +363,35 @@ create_new_objects(void) } /* - * Delete the given subdirectory contents from the new cluster, and copy the - * files from the old cluster into it. + * Delete the given subdirectory contents from the new cluster */ static void -copy_subdir_files(char *subdir) +remove_new_subdir(char *subdir, bool rmtopdir) { - char old_path[MAXPGPATH]; char new_path[MAXPGPATH]; prep_status("Deleting files from new %s", subdir); - snprintf(old_path, sizeof(old_path), "%s/%s", old_cluster.pgdata, subdir); snprintf(new_path, sizeof(new_path), "%s/%s", new_cluster.pgdata, subdir); - if (!rmtree(new_path, true)) + if (!rmtree(new_path, rmtopdir)) pg_fatal("could not delete directory \"%s\"\n", new_path); + check_ok(); +} + +/* + * Copy the files from the old cluster into it + */ +static void +copy_subdir_files(char *subdir) +{ + char old_path[MAXPGPATH]; + char new_path[MAXPGPATH]; + + remove_new_subdir(subdir, true); + + snprintf(old_path, sizeof(old_path), "%s/%s", old_cluster.pgdata, subdir); + snprintf(new_path, sizeof(new_path), "%s/%s", new_cluster.pgdata, subdir); prep_status("Copying old %s to new server", subdir); @@ -419,6 +432,7 @@ copy_clog_xlog_xid(void) { copy_subdir_files("pg_multixact/offsets"); copy_subdir_files("pg_multixact/members"); + prep_status("Setting next multixact ID and offset for new cluster"); /* @@ -436,6 +450,13 @@ copy_clog_xlog_xid(void) } else if (new_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER) { + /* + * Remove files created by initdb that no longer match the + * new multi-xid value. + */ + remove_new_subdir("pg_multixact/offsets", false); + remove_new_subdir("pg_multixact/members", false); + prep_status("Setting oldest multixact ID on new cluster"); /*