]> granicus.if.org Git - postgresql/commitdiff
Fix pg_rewind to handle relation data files in tablespaces properly.
authorFujii Masao <fujii@postgresql.org>
Mon, 5 Mar 2018 17:08:18 +0000 (02:08 +0900)
committerFujii Masao <fujii@postgresql.org>
Mon, 5 Mar 2018 17:09:12 +0000 (02:09 +0900)
pg_rewind checks whether each file is a relation data file, from its path.
Previously this check logic had the bug which made pg_rewind fail to
recognize any relation data files in tablespaces. Which also caused
an assertion failure in pg_rewind.

Back-patch to 9.5 where pg_rewind was added.

Author: Takayuki Tsunakawa
Reviewed-by: Michael Paquier
Discussion: https://postgr.es/m/0A3221C70F24FB45833433255569204D1F8D6C7A@G01JPEXMBYT05

src/bin/pg_rewind/filemap.c

index dd6919025d9e13e1ca7d219cf91375f7c6c7dffe..ee7b1a8a3a05f057179ee7896d28b1183fb0e112 100644 (file)
@@ -19,6 +19,7 @@
 #include "pg_rewind.h"
 
 #include "common/string.h"
+#include "catalog/catalog.h"
 #include "catalog/pg_tablespace.h"
 #include "storage/fd.h"
 
@@ -554,7 +555,6 @@ print_filemap(void)
 static bool
 isRelDataFile(const char *path)
 {
-       char            buf[20 + 1];
        RelFileNode rnode;
        unsigned int segNo;
        int                     nmatch;
@@ -569,7 +569,7 @@ isRelDataFile(const char *path)
         * base/<db oid>/
         *              regular relations, default tablespace
         *
-        * pg_tblspc/<tblspc oid>/PG_9.4_201403261/
+        * pg_tblspc/<tblspc oid>/<tblspc version>/
         *              within a non-default tablespace (the name of the directory
         *              depends on version)
         *
@@ -603,21 +603,19 @@ isRelDataFile(const char *path)
                }
                else
                {
-                       nmatch = sscanf(path, "pg_tblspc/%u/PG_%20s/%u/%u.%u",
-                                                       &rnode.spcNode, buf, &rnode.dbNode, &rnode.relNode,
+                       nmatch = sscanf(path, "pg_tblspc/%u/" TABLESPACE_VERSION_DIRECTORY "/%u/%u.%u",
+                                                       &rnode.spcNode, &rnode.dbNode, &rnode.relNode,
                                                        &segNo);
-                       if (nmatch == 4 || nmatch == 5)
+                       if (nmatch == 3 || nmatch == 4)
                                matched = true;
                }
        }
 
        /*
         * The sscanf tests above can match files that have extra characters at
-        * the end, and the last check can also match a path belonging to a
-        * different version (different TABLESPACE_VERSION_DIRECTORY). To make
-        * eliminate such cases, cross-check that GetRelationPath creates the
-        * exact same filename, when passed the RelFileNode information we
-        * extracted from the filename.
+        * the end. To eliminate such cases, cross-check that GetRelationPath
+        * creates the exact same filename, when passed the RelFileNode information
+        * we extracted from the filename.
         */
        if (matched)
        {