Skip to content

Commit 5947741

Browse files
committed
fix reading the block for ptrack backups
1 parent 933135a commit 5947741

File tree

3 files changed

+42
-15
lines changed

3 files changed

+42
-15
lines changed

src/backup.c

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2668,25 +2668,30 @@ get_last_ptrack_lsn(void)
26682668
}
26692669

26702670
char *
2671-
pg_ptrack_get_block(Oid relOid,
2671+
pg_ptrack_get_block(Oid tblsOid,
2672+
Oid relOid,
26722673
BlockNumber blknum,
26732674
size_t *result_size)
26742675
{
26752676
PGresult *res;
2676-
char *params[2];
2677+
char *params[3];
26772678
char *result;
26782679
char *val;
26792680

26802681
params[0] = palloc(64);
26812682
params[1] = palloc(64);
2683+
params[2] = palloc(64);
26822684

26832685
/*
26842686
* Use backup_conn, cause we can do it from any database.
26852687
*/
2686-
sprintf(params[0], "%i", relOid);
2687-
sprintf(params[1], "%u", blknum);
2688-
res = pgut_execute(backup_conn, "SELECT pg_ptrack_get_block($1, $2)",
2689-
2, (const char **)params, true);
2688+
sprintf(params[0], "%i", tblsOid);
2689+
sprintf(params[1], "%i", relOid);
2690+
sprintf(params[2], "%u", blknum);
2691+
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)",
2694+
3, (const char **)params, true);
26902695

26912696
if (PQnfields(res) != 1)
26922697
elog(WARNING, "cannot get file block for relation oid %u",
@@ -2695,16 +2700,14 @@ pg_ptrack_get_block(Oid relOid,
26952700
val = PQgetvalue(res, 0, 0);
26962701

26972702
if (strcmp("x", val+1) == 0)
2698-
{
2699-
/* Ptrack file is missing */
27002703
return NULL;
2701-
}
27022704

27032705
result = (char *) PQunescapeBytea((unsigned char *) PQgetvalue(res, 0, 0),
27042706
result_size);
27052707
PQclear(res);
27062708
pfree(params[0]);
27072709
pfree(params[1]);
2710+
pfree(params[2]);
27082711

27092712
return result;
27102713
}

src/data.c

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
227227
{
228228
BackupPageHeader header;
229229
Page page = malloc(BLCKSZ);
230-
Page compressed_page = malloc(BLCKSZ);
230+
Page compressed_page;
231231
size_t write_buffer_size;
232232
char write_buffer[BLCKSZ+sizeof(header)];
233233

@@ -243,9 +243,19 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
243243
{
244244
while(!page_is_valid && try_again)
245245
{
246+
int result = read_page_from_file(file, blknum,
247+
in, out, page);
248+
246249
try_again--;
247-
page_is_valid = read_page_from_file(file, blknum,
248-
in, out, page);
250+
/* This block was truncated. Do nothing */
251+
if (result == 0)
252+
{
253+
free(page);
254+
return;
255+
}
256+
257+
if (result == 1)
258+
page_is_valid = true;
249259
}
250260
}
251261

@@ -254,13 +264,27 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
254264
{
255265
size_t page_size = 0;
256266
free(page);
257-
page = (Page) pg_ptrack_get_block(file->relOid, blknum, &page_size);
258-
}
267+
page = NULL;
268+
269+
page = (Page) pg_ptrack_get_block(file->tblspcOid, file->relOid, blknum, &page_size);
259270

271+
if (page == NULL)
272+
{
273+
elog(WARNING, "File %s, block %u, file was truncated",
274+
file->path, blknum);
275+
return;
276+
}
277+
278+
if (page_size != BLCKSZ)
279+
elog(ERROR, "File: %s, block %u, expected block size %lu,"
280+
"but read %d, try again",
281+
file->path, blknum, page_size, BLCKSZ);
282+
}
260283

261284

262285
file->read_size += BLCKSZ;
263286

287+
compressed_page = malloc(BLCKSZ);
264288
header.block = blknum;
265289
header.compressed_size = do_compress(compressed_page, BLCKSZ,
266290
page, BLCKSZ, compress_alg);

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 relOid, BlockNumber blknum,
323+
extern char *pg_ptrack_get_block(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)