From: Fujii Masao Date: Mon, 5 Mar 2018 17:08:18 +0000 (+0900) Subject: Fix pg_rewind to handle relation data files in tablespaces properly. X-Git-Tag: REL_10_4~98 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bca696ab0bff306a01870306c0dfc9971b079c4e;p=postgresql Fix pg_rewind to handle relation data files in tablespaces properly. 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 --- diff --git a/src/bin/pg_rewind/filemap.c b/src/bin/pg_rewind/filemap.c index dd6919025d..ee7b1a8a3a 100644 --- a/src/bin/pg_rewind/filemap.c +++ b/src/bin/pg_rewind/filemap.c @@ -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// * regular relations, default tablespace * - * pg_tblspc//PG_9.4_201403261/ + * pg_tblspc/// * 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) {