Skip to content

Commit e9e25d9

Browse files
committed
Fix parsing db_oid from relation path in make_pagemap_from_ptrack()
1 parent 737c8b0 commit e9e25d9

File tree

1 file changed

+28
-13
lines changed

1 file changed

+28
-13
lines changed

backup.c

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,8 @@ pg_ptrack_get_and_clear(Oid tablespace_oid, Oid db_oid, Oid rel_oid,
700700
res_db = pgut_execute(backup_conn,
701701
"SELECT datname FROM pg_database WHERE oid=$1",
702702
1, (const char **) params);
703+
if (PQntuples(res_db) != 1 || PQnfields(res_db) != 1)
704+
elog(ERROR, "cannot find database by oid %u", db_oid);
703705

704706
dbname = pstrdup(PQgetvalue(res_db, 0, 0));
705707
PQclear(res_db);
@@ -710,6 +712,9 @@ pg_ptrack_get_and_clear(Oid tablespace_oid, Oid db_oid, Oid rel_oid,
710712

711713
res = pgut_execute(tmp_conn, "SELECT pg_ptrack_get_and_clear($1, $2)",
712714
2, (const char **)params);
715+
if (PQnfields(res) != 1)
716+
elog(ERROR, "cannot get ptrack file from database \"%s\" by tablespace oid %u and relation oid %u",
717+
dbname, tablespace_oid, rel_oid);
713718
result = (char *) PQunescapeBytea((unsigned char *) PQgetvalue(res, 0, 0),
714719
result_size);
715720
PQclear(res);
@@ -1447,23 +1452,23 @@ process_block_change(ForkNumber forknum, RelFileNode rnode, BlockNumber blkno)
14471452
static void
14481453
make_pagemap_from_ptrack(parray *files)
14491454
{
1450-
int i;
1455+
size_t i;
14511456

14521457
for (i = 0; i < parray_num(files); i++)
14531458
{
1454-
pgFile *p = (pgFile *) parray_get(files, i);
1459+
pgFile *p = (pgFile *) parray_get(files, i);
14551460

14561461
if (p->ptrack_path != NULL)
14571462
{
1458-
char * tablespace;
1459-
Oid db_oid,
1460-
rel_oid,
1461-
tablespace_oid = 0;
1462-
int sep_iter,
1463-
sep_count = 0;
1464-
char *ptrack_nonparsed;
1465-
size_t ptrack_nonparsed_size = 0;
1466-
size_t start_addr;
1463+
char *tablespace;
1464+
Oid db_oid,
1465+
rel_oid,
1466+
tablespace_oid = 0;
1467+
int sep_iter,
1468+
sep_count = 0;
1469+
char *ptrack_nonparsed;
1470+
size_t ptrack_nonparsed_size = 0;
1471+
size_t start_addr;
14671472

14681473
tablespace = strstr(p->ptrack_path, PG_TBLSPC_DIR);
14691474

@@ -1476,13 +1481,23 @@ make_pagemap_from_ptrack(parray *files)
14761481
* base/db_oid/rel_oid
14771482
*/
14781483
sep_iter = strlen(p->path);
1479-
while (sep_count != 2 && sep_iter >= 0)
1484+
while (sep_iter >= 0)
1485+
{
1486+
if (IS_DIR_SEP(p->path[sep_iter]))
1487+
sep_count++;
1488+
if (sep_count == 2)
1489+
break;
14801490
sep_iter--;
1491+
}
1492+
1493+
if (sep_iter <= 0)
1494+
elog(ERROR, "path of the file \"%s\" has wrong format",
1495+
p->path);
14811496

14821497
sscanf(p->path + sep_iter + 1, "%u/%u", &db_oid, &rel_oid);
14831498

14841499
ptrack_nonparsed = pg_ptrack_get_and_clear(tablespace_oid, db_oid,
1485-
rel_oid, &ptrack_nonparsed_size);
1500+
rel_oid, &ptrack_nonparsed_size);
14861501

14871502
/* TODO What is 8? */
14881503
start_addr = (RELSEG_SIZE/8)*p->segno;

0 commit comments

Comments
 (0)