]> granicus.if.org Git - postgresql/commitdiff
In pg_upgrade, don't copy visibility map files from clusters that did not
authorBruce Momjian <bruce@momjian.us>
Fri, 19 Aug 2011 15:20:30 +0000 (11:20 -0400)
committerBruce Momjian <bruce@momjian.us>
Fri, 19 Aug 2011 15:20:30 +0000 (11:20 -0400)
have crash-safe visibility maps to clusters that expect crash-safety.

Request from Robert Haas.

contrib/pg_upgrade/pg_upgrade.h
contrib/pg_upgrade/relfilenode.c

index 6def748ae81f796e2053e520a5718d6dd7f3d7f3..a19b3df4393016e761ceab9b6b891593812c1109 100644 (file)
 #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.
index d4a420fe2cd513e2d7a9d0867e500bf93b3d9c4c..df752c5fad0ea33633e078ab648b26755255ab26 100644 (file)
@@ -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);