From: Bruce Momjian Date: Tue, 24 Jun 2014 20:11:06 +0000 (-0400) Subject: pg_upgrade: remove pg_multixact files left by initdb X-Git-Tag: REL9_3_5~28 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cc584180967490f7084b4d2328970fecdd7bc179;p=thirdparty%2Fpostgresql.git pg_upgrade: remove pg_multixact files left by initdb This fixes a bug that caused vacuum to fail when the '0000' files left by initdb were accessed as part of vacuum's cleanup of old pg_multixact files. Backpatch through 9.3 --- diff --git a/contrib/pg_upgrade/pg_upgrade.c b/contrib/pg_upgrade/pg_upgrade.c index cd70b6afeec..91618f8b538 100644 --- a/contrib/pg_upgrade/pg_upgrade.c +++ b/contrib/pg_upgrade/pg_upgrade.c @@ -364,22 +364,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_log(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); @@ -420,6 +433,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"); /* @@ -437,6 +451,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"); /*