Symlink pg_replslot robustly on Windows in pg_basebackup test
authorAndrew Dunstan <andrew@dunslane.net>
Mon, 8 Jul 2024 17:46:21 +0000 (13:46 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Mon, 8 Jul 2024 17:53:54 +0000 (13:53 -0400)
This reverts commit e9f15bc9. Instead of a hacky solution that didn't
work on Windows, we avoid trying to move the directory possibly across
drives, and instead remove it and recreate it in the new location.

Discussion: https://postgr.es/m/20240707070243.sb77kp4ubowauctz@awork3.anarazel.de

Backpatch to release 14 like the previous patch.

src/bin/pg_basebackup/t/010_pg_basebackup.pl

index 476db8ad68f471cb382e19630a4af4705e64cd1c..cc04417a3feef295d280c85638ebfa8fa8e4b5ae 100644 (file)
@@ -234,13 +234,13 @@ chmod_recursive("$pgdata", 0750, 0640);
 # Create a temporary directory in the system location.
 my $sys_tempdir = TestLib::tempdir_short;
 
-# On Windows use the short location to avoid path length issues.
-# Elsewhere use $tempdir to avoid file system boundary issues with moving.
-my $tmploc = $windows_os ? $sys_tempdir : $tempdir;
-
-rename("$pgdata/pg_replslot", "$tmploc/pg_replslot")
-  or BAIL_OUT "could not move $pgdata/pg_replslot";
-dir_symlink("$tmploc/pg_replslot", "$pgdata/pg_replslot")
+# pg_replslot should be empty. We remove it and recreate it in $sys_tempdir
+# before symlinking, in order to avoid possibly trying to move things across
+# drives.
+rmdir("$pgdata/pg_replslot")
+  or BAIL_OUT "could not remove $pgdata/pg_replslot";
+mkdir("$sys_tempdir/pg_replslot"); # if this fails the symlink will fail
+dir_symlink("$sys_tempdir/pg_replslot", "$pgdata/pg_replslot")
   or BAIL_OUT "could not symlink to $pgdata/pg_replslot";
 
 $node->start;