@@ -120,9 +120,15 @@ transfer_single_new_db(pageCnvCtx *pageConverter,
120
120
int numFiles = 0 ;
121
121
int mapnum ;
122
122
int fileno ;
123
-
123
+ bool vm_crashsafe_change = false;
124
+
124
125
old_dir [0 ]= '\0' ;
125
126
127
+ /* Do not copy non-crashsafe vm files for binaries that assume crashsafety */
128
+ if (old_cluster .controldata .cat_ver < VISIBILITY_MAP_CRASHSAFE_CAT_VER &&
129
+ new_cluster .controldata .cat_ver >=VISIBILITY_MAP_CRASHSAFE_CAT_VER )
130
+ vm_crashsafe_change = true;
131
+
126
132
for (mapnum = 0 ;mapnum < size ;mapnum ++ )
127
133
{
128
134
char old_file [MAXPGPATH ];
@@ -168,8 +174,16 @@ transfer_single_new_db(pageCnvCtx *pageConverter,
168
174
169
175
for (fileno = 0 ;fileno < numFiles ;fileno ++ )
170
176
{
177
+ char * vm_offset = strstr (namelist [fileno ]-> d_name ,"_vm" );
178
+ bool is_vm_file = false;
179
+
180
+ /* Is a visibility map file? (name ends with _vm) */
181
+ if (vm_offset && strlen (vm_offset )== strlen ("_vm" ))
182
+ is_vm_file = true;
183
+
171
184
if (strncmp (namelist [fileno ]-> d_name ,scandir_file_pattern ,
172
- strlen (scandir_file_pattern ))== 0 )
185
+ strlen (scandir_file_pattern ))== 0 &&
186
+ (!is_vm_file || !vm_crashsafe_change ))
173
187
{
174
188
snprintf (old_file ,sizeof (old_file ),"%s/%s" ,maps [mapnum ].old_dir ,
175
189
namelist [fileno ]-> d_name );