aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2011-08-19 11:20:30 -0400
committerBruce Momjian <bruce@momjian.us>2011-08-19 11:20:30 -0400
commit00a7c9014a8fbb7388a807daeba3e0a85b49a747 (patch)
treed952eb55a4cf4c0f6550976040c1810ae9fb7c07
parentffaf9eca4c27d0a63639ffb3022035a297df9900 (diff)
downloadpostgresql-00a7c9014a8fbb7388a807daeba3e0a85b49a747.tar.gz
postgresql-00a7c9014a8fbb7388a807daeba3e0a85b49a747.zip
In pg_upgrade, don't copy visibility map files from clusters that did not
have crash-safe visibility maps to clusters that expect crash-safety. Request from Robert Haas.
-rw-r--r--contrib/pg_upgrade/pg_upgrade.h6
-rw-r--r--contrib/pg_upgrade/relfilenode.c18
2 files changed, 22 insertions, 2 deletions
diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h
index 6def748ae81..a19b3df4393 100644
--- a/contrib/pg_upgrade/pg_upgrade.h
+++ b/contrib/pg_upgrade/pg_upgrade.h
@@ -64,6 +64,12 @@
#define TABLE_SPACE_SUBDIRS_CAT_VER 201001111
/* postmaster/postgres -b (binary_upgrade) flag added during PG 9.1 development */
#define BINARY_UPGRADE_SERVER_FLAG_CAT_VER 201104251
+/*
+ * Visibility map changed with this 9.2 commit,
+ * 8f9fe6edce358f7904e0db119416b4d1080a83aa; pick later catalog version.
+ */
+#define VISIBILITY_MAP_CRASHSAFE_CAT_VER 201107031
+
/*
* Each relation is represented by a relinfo structure.
diff --git a/contrib/pg_upgrade/relfilenode.c b/contrib/pg_upgrade/relfilenode.c
index d4a420fe2cd..df752c5fad0 100644
--- a/contrib/pg_upgrade/relfilenode.c
+++ b/contrib/pg_upgrade/relfilenode.c
@@ -120,9 +120,15 @@ transfer_single_new_db(pageCnvCtx *pageConverter,
int numFiles = 0;
int mapnum;
int fileno;
-
+ bool vm_crashsafe_change = false;
+
old_dir[0] = '\0';
+ /* Do not copy non-crashsafe vm files for binaries that assume crashsafety */
+ if (old_cluster.controldata.cat_ver < VISIBILITY_MAP_CRASHSAFE_CAT_VER &&
+ new_cluster.controldata.cat_ver >= VISIBILITY_MAP_CRASHSAFE_CAT_VER)
+ vm_crashsafe_change = true;
+
for (mapnum = 0; mapnum < size; mapnum++)
{
char old_file[MAXPGPATH];
@@ -168,8 +174,16 @@ transfer_single_new_db(pageCnvCtx *pageConverter,
for (fileno = 0; fileno < numFiles; fileno++)
{
+ char *vm_offset = strstr(namelist[fileno]->d_name, "_vm");
+ bool is_vm_file = false;
+
+ /* Is a visibility map file? (name ends with _vm) */
+ if (vm_offset && strlen(vm_offset) == strlen("_vm"))
+ is_vm_file = true;
+
if (strncmp(namelist[fileno]->d_name, scandir_file_pattern,
- strlen(scandir_file_pattern)) == 0)
+ strlen(scandir_file_pattern)) == 0 &&
+ (!is_vm_file || !vm_crashsafe_change))
{
snprintf(old_file, sizeof(old_file), "%s/%s", maps[mapnum].old_dir,
namelist[fileno]->d_name);