Skip to content

Commit 109b996

Browse files
committed
fix databaseOID usage for pg_ptrack_get_block()
1 parent c5f0787 commit 109b996

File tree

3 files changed

+43
-8
lines changed

3 files changed

+43
-8
lines changed

src/backup.c

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2668,29 +2668,59 @@ get_last_ptrack_lsn(void)
26682668
}
26692669

26702670
char *
2671-
pg_ptrack_get_block(Oid tblsOid,
2671+
pg_ptrack_get_block(Oid dbOid,
2672+
Oid tblsOid,
26722673
Oid relOid,
26732674
BlockNumber blknum,
26742675
size_t *result_size)
26752676
{
2677+
PGresult *res_db;
26762678
PGresult *res;
2679+
const char *dbname;
26772680
char *params[3];
26782681
char *result;
26792682
char *val;
2683+
PGconn *tmp_conn;
26802684

26812685
params[0] = palloc(64);
26822686
params[1] = palloc(64);
26832687
params[2] = palloc(64);
26842688

2689+
sprintf(params[0], "%i", dbOid);
2690+
res_db = pgut_execute(backup_conn,
2691+
"SELECT datname FROM pg_database WHERE oid=$1",
2692+
1, (const char **) params, true);
2693+
/*
2694+
* If database is not found, it's not an error.
2695+
* It could have been deleted.
2696+
*/
2697+
if (PQntuples(res_db) != 1 || PQnfields(res_db) != 1)
2698+
{
2699+
//elog(LOG, "Database with oid %d is not found", dbOid);
2700+
return NULL;
2701+
}
2702+
2703+
dbname = PQgetvalue(res_db, 0, 0);
2704+
if (strcmp(dbname, "template0") == 0)
2705+
{
2706+
/*
2707+
* There is no way to connect to the template0 database.
2708+
* But it's totally OK, since files there can never be changed.
2709+
*/
2710+
return NULL;
2711+
}
2712+
tmp_conn = pgut_connect(dbname);
2713+
26852714
/*
26862715
* Use backup_conn, cause we can do it from any database.
26872716
*/
26882717
sprintf(params[0], "%i", tblsOid);
26892718
sprintf(params[1], "%i", relOid);
26902719
sprintf(params[2], "%u", blknum);
26912720

2692-
// elog(WARNING, "pg_ptrack_get_block(%i, %i, %u)", tblsOid, relOid, blknum);
2693-
res = pgut_execute(backup_conn, "SELECT pg_ptrack_get_block($1, $2, $3)",
2721+
//elog(WARNING, "db %i pg_ptrack_get_block(%i, %i, %u)",dbOid, tblsOid, relOid, blknum);
2722+
2723+
res = pgut_execute(tmp_conn, "SELECT pg_ptrack_get_block($1, $2, $3)",
26942724
3, (const char **)params, true);
26952725

26962726
if (PQnfields(res) != 1)
@@ -2704,7 +2734,10 @@ pg_ptrack_get_block(Oid tblsOid,
27042734

27052735
result = (char *) PQunescapeBytea((unsigned char *) PQgetvalue(res, 0, 0),
27062736
result_size);
2737+
2738+
pgut_disconnect(tmp_conn);
27072739
PQclear(res);
2740+
PQclear(res_db);
27082741
pfree(params[0]);
27092742
pfree(params[1]);
27102743
pfree(params[2]);

src/data.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,13 +268,15 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
268268

269269
free(page);
270270
page = NULL;
271-
272-
page = (Page) pg_ptrack_get_block(file->tblspcOid, file->relOid, absolute_blknum, &page_size);
271+
page = (Page) pg_ptrack_get_block(file->dbOid, file->tblspcOid,
272+
file->relOid, absolute_blknum, &page_size);
273273

274274
if (page == NULL)
275275
{
276-
elog(WARNING, "File %s, block %u, file was truncated",
277-
file->path, absolute_blknum);
276+
/*
277+
* We may skip block for various reasons. It's fine.
278+
* Otherwise pg_ptrack_get_block would have failed with ERROR.
279+
*/
278280
return;
279281
}
280282

src/pg_probackup.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ extern const char *deparse_backup_mode(BackupMode mode);
320320
extern void process_block_change(ForkNumber forknum, RelFileNode rnode,
321321
BlockNumber blkno);
322322

323-
extern char *pg_ptrack_get_block(Oid tblsOid, Oid relOid, BlockNumber blknum,
323+
extern char *pg_ptrack_get_block(Oid dbOid, Oid tblsOid, Oid relOid, BlockNumber blknum,
324324
size_t *result_size);
325325
/* in restore.c */
326326
extern int do_restore_or_validate(time_t target_backup_id,

0 commit comments

Comments
 (0)