Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit ac195f4

Browse files
committed
truncate restored files when necessary
1 parent 07a1630 commit ac195f4

File tree

1 file changed

+33
-25
lines changed

1 file changed

+33
-25
lines changed

src/data.c

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ parse_page(Page page, XLogRecPtr *lsn)
129129
*/
130130
static int
131131
read_page_from_file(pgFile *file, BlockNumber blknum,
132-
FILE *in, FILE *out, Page page)
132+
FILE *in, Page page)
133133
{
134134
off_t offset = blknum*BLCKSZ;
135135
size_t read_len = 0;
@@ -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;
230+
Page compressed_page = NULL;
231231
size_t write_buffer_size;
232232
char write_buffer[BLCKSZ+sizeof(header)];
233233

@@ -245,7 +245,7 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
245245
while(!page_is_valid && try_again)
246246
{
247247
int result = read_page_from_file(file, blknum,
248-
in, out, page);
248+
in, page);
249249

250250
try_again--;
251251
/* This block was truncated.*/
@@ -275,13 +275,16 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
275275
/* This block was truncated.*/
276276
header.compressed_size = -1;
277277
}
278-
279-
if (page_size != BLCKSZ)
278+
else if (page_size != BLCKSZ)
279+
{
280280
elog(ERROR, "File: %s, block %u, expected block size %lu,"
281281
"but read %d, try again",
282282
file->path, absolute_blknum, page_size, BLCKSZ);
283-
284-
((PageHeader) page)->pd_checksum = pg_checksum_page(page, absolute_blknum);
283+
}
284+
else
285+
{
286+
((PageHeader) page)->pd_checksum = pg_checksum_page(page, absolute_blknum);
287+
}
285288
}
286289

287290
if (header.compressed_size != -1)
@@ -335,8 +338,10 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
335338

336339
file->write_size += write_buffer_size;
337340

338-
free(page);
339-
free(compressed_page);
341+
if (page != NULL)
342+
free(page);
343+
if (compressed_page != NULL)
344+
free(compressed_page);
340345
}
341346

342347
/*
@@ -563,25 +568,28 @@ restore_data_file(const char *from_root,
563568
if (header.block < blknum)
564569
elog(ERROR, "backup is broken at block %u", blknum);
565570

566-
//elog(VERBOSE, "file %s, header compressed size %d", file->path, header.compressed_size);
567-
Assert(header.compressed_size <= BLCKSZ);
571+
if (header.compressed_size != -1)
572+
{
573+
//elog(VERBOSE, "file %s, header compressed size %d", file->path, header.compressed_size);
574+
Assert(header.compressed_size <= BLCKSZ);
568575

569-
read_len = fread(compressed_page.data, 1,
570-
MAXALIGN(header.compressed_size), in);
571-
if (read_len != MAXALIGN(header.compressed_size))
572-
elog(ERROR, "cannot read block %u of \"%s\" read %lu of %d",
573-
blknum, file->path, read_len, header.compressed_size);
576+
read_len = fread(compressed_page.data, 1,
577+
MAXALIGN(header.compressed_size), in);
578+
if (read_len != MAXALIGN(header.compressed_size))
579+
elog(ERROR, "cannot read block %u of \"%s\" read %lu of %d",
580+
blknum, file->path, read_len, header.compressed_size);
574581

575-
if (header.compressed_size < BLCKSZ)
576-
{
577-
size_t uncompressed_size = 0;
582+
if (header.compressed_size != BLCKSZ)
583+
{
584+
size_t uncompressed_size = 0;
578585

579-
uncompressed_size = do_decompress(page.data, BLCKSZ,
580-
compressed_page.data,
581-
header.compressed_size, file->compress_alg);
586+
uncompressed_size = do_decompress(page.data, BLCKSZ,
587+
compressed_page.data,
588+
header.compressed_size, file->compress_alg);
582589

583-
if (uncompressed_size != BLCKSZ)
584-
elog(ERROR, "page uncompressed to %ld bytes. != BLCKSZ", uncompressed_size);
590+
if (uncompressed_size != BLCKSZ)
591+
elog(ERROR, "page uncompressed to %ld bytes. != BLCKSZ", uncompressed_size);
592+
}
585593
}
586594

587595
/*
@@ -598,7 +606,7 @@ restore_data_file(const char *from_root,
598606
* Backup contains information that this block was truncated.
599607
* Truncate file to this length.
600608
*/
601-
ftruncate(out, blknum * BLCKSZ);
609+
ftruncate(fileno(out), blknum * BLCKSZ);
602610
break;
603611
}
604612
else if (header.compressed_size < BLCKSZ)

0 commit comments

Comments
 (0)