Fix pg_basebackup with in-place tablespaces.
authorThomas Munro <tmunro@postgresql.org>
Tue, 15 Mar 2022 00:38:41 +0000 (13:38 +1300)
committerThomas Munro <tmunro@postgresql.org>
Tue, 15 Mar 2022 01:01:23 +0000 (14:01 +1300)
Previously, pg_basebackup from a cluster that contained an 'in-place'
tablespace, as introduced by commit 7170f215, would produce a harmless
warning on Unix and fail completely on Windows.

Reported-by: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Reviewed-by: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://postgr.es/m/20220304.165449.1200020258723305904.horikyota.ntt%40gmail.com

src/backend/access/transam/xlog.c

index 0d2bd7a35762e067d8bbf95cb0f5cf34a1373f0b..a22f7addacc99623792c686f385e794e909ca365 100644 (file)
@@ -66,6 +66,7 @@
 #include "catalog/pg_control.h"
 #include "catalog/pg_database.h"
 #include "common/controldata_utils.h"
+#include "common/file_utils.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pg_trace.h"
@@ -8292,6 +8293,19 @@ do_pg_start_backup(const char *backupidstr, bool fast, TimeLineID *starttli_p,
 
            snprintf(fullpath, sizeof(fullpath), "pg_tblspc/%s", de->d_name);
 
+           /*
+            * Skip anything that isn't a symlink/junction.  For testing only,
+            * we sometimes use allow_in_place_tablespaces to create
+            * directories directly under pg_tblspc, which would fail below.
+            */
+#ifdef WIN32
+           if (!pgwin32_is_junction(fullpath))
+               continue;
+#else
+           if (get_dirent_type(fullpath, de, false, ERROR) != PGFILETYPE_LNK)
+               continue;
+#endif
+
 #if defined(HAVE_READLINK) || defined(WIN32)
            rllen = readlink(fullpath, linkpath, sizeof(linkpath));
            if (rllen < 0)