1
0
mirror of https://github.com/postgrespro/pg_probackup.git synced 2025-02-08 14:28:36 +02:00

fix reading the block for ptrack backups

This commit is contained in:
Anastasia 2017-12-27 18:49:30 +03:00
parent 933135a594
commit 59477414c6
3 changed files with 42 additions and 15 deletions

View File

@ -2668,25 +2668,30 @@ get_last_ptrack_lsn(void)
}
char *
pg_ptrack_get_block(Oid relOid,
pg_ptrack_get_block(Oid tblsOid,
Oid relOid,
BlockNumber blknum,
size_t *result_size)
{
PGresult *res;
char *params[2];
char *params[3];
char *result;
char *val;
params[0] = palloc(64);
params[1] = palloc(64);
params[2] = palloc(64);
/*
* Use backup_conn, cause we can do it from any database.
*/
sprintf(params[0], "%i", relOid);
sprintf(params[1], "%u", blknum);
res = pgut_execute(backup_conn, "SELECT pg_ptrack_get_block($1, $2)",
2, (const char **)params, true);
sprintf(params[0], "%i", tblsOid);
sprintf(params[1], "%i", relOid);
sprintf(params[2], "%u", blknum);
// elog(WARNING, "pg_ptrack_get_block(%i, %i, %u)", tblsOid, relOid, blknum);
res = pgut_execute(backup_conn, "SELECT pg_ptrack_get_block($1, $2, $3)",
3, (const char **)params, true);
if (PQnfields(res) != 1)
elog(WARNING, "cannot get file block for relation oid %u",
@ -2695,16 +2700,14 @@ pg_ptrack_get_block(Oid relOid,
val = PQgetvalue(res, 0, 0);
if (strcmp("x", val+1) == 0)
{
/* Ptrack file is missing */
return NULL;
}
result = (char *) PQunescapeBytea((unsigned char *) PQgetvalue(res, 0, 0),
result_size);
PQclear(res);
pfree(params[0]);
pfree(params[1]);
pfree(params[2]);
return result;
}

View File

@ -227,7 +227,7 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
{
BackupPageHeader header;
Page page = malloc(BLCKSZ);
Page compressed_page = malloc(BLCKSZ);
Page compressed_page;
size_t write_buffer_size;
char write_buffer[BLCKSZ+sizeof(header)];
@ -243,9 +243,19 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
{
while(!page_is_valid && try_again)
{
int result = read_page_from_file(file, blknum,
in, out, page);
try_again--;
page_is_valid = read_page_from_file(file, blknum,
in, out, page);
/* This block was truncated. Do nothing */
if (result == 0)
{
free(page);
return;
}
if (result == 1)
page_is_valid = true;
}
}
@ -254,13 +264,27 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
{
size_t page_size = 0;
free(page);
page = (Page) pg_ptrack_get_block(file->relOid, blknum, &page_size);
}
page = NULL;
page = (Page) pg_ptrack_get_block(file->tblspcOid, file->relOid, blknum, &page_size);
if (page == NULL)
{
elog(WARNING, "File %s, block %u, file was truncated",
file->path, blknum);
return;
}
if (page_size != BLCKSZ)
elog(ERROR, "File: %s, block %u, expected block size %lu,"
"but read %d, try again",
file->path, blknum, page_size, BLCKSZ);
}
file->read_size += BLCKSZ;
compressed_page = malloc(BLCKSZ);
header.block = blknum;
header.compressed_size = do_compress(compressed_page, BLCKSZ,
page, BLCKSZ, compress_alg);

View File

@ -320,7 +320,7 @@ extern const char *deparse_backup_mode(BackupMode mode);
extern void process_block_change(ForkNumber forknum, RelFileNode rnode,
BlockNumber blkno);
extern char *pg_ptrack_get_block(Oid relOid, BlockNumber blknum,
extern char *pg_ptrack_get_block(Oid tblsOid, Oid relOid, BlockNumber blknum,
size_t *result_size);
/* in restore.c */
extern int do_restore_or_validate(time_t target_backup_id,