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

Commit 07a1630

Browse files
committed
fix for parallel truncate
1 parent 9255205 commit 07a1630

File tree

2 files changed

+38
-19
lines changed

2 files changed

+38
-19
lines changed

src/backup.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2727,6 +2727,13 @@ pg_ptrack_get_block(Oid dbOid,
27272727
return NULL;
27282728
}
27292729

2730+
if (PQgetisnull(res, 0, 0))
2731+
{
2732+
elog(LOG, "cannot get file block for relation oid %u",
2733+
relOid);
2734+
return NULL;
2735+
}
2736+
27302737
val = PQgetvalue(res, 0, 0);
27312738

27322739
if (strcmp("x", val+1) == 0)

src/data.c

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -248,11 +248,10 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
248248
in, out, page);
249249

250250
try_again--;
251-
/* This block was truncated. Do nothing */
251+
/* This block was truncated.*/
252252
if (result == 0)
253253
{
254-
free(page);
255-
return;
254+
header.compressed_size = -1;
256255
}
257256

258257
if (result == 1)
@@ -273,11 +272,8 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
273272

274273
if (page == NULL)
275274
{
276-
/*
277-
* We may skip block for various reasons. It's fine.
278-
* Otherwise pg_ptrack_get_block would have failed with ERROR.
279-
*/
280-
return;
275+
/* This block was truncated.*/
276+
header.compressed_size = -1;
281277
}
282278

283279
if (page_size != BLCKSZ)
@@ -288,18 +284,20 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
288284
((PageHeader) page)->pd_checksum = pg_checksum_page(page, absolute_blknum);
289285
}
290286

287+
if (header.compressed_size != -1)
288+
{
289+
file->read_size += BLCKSZ;
291290

292-
file->read_size += BLCKSZ;
293-
294-
compressed_page = malloc(BLCKSZ);
295-
header.block = blknum;
296-
header.compressed_size = do_compress(compressed_page, BLCKSZ,
297-
page, BLCKSZ, compress_alg);
291+
compressed_page = malloc(BLCKSZ);
292+
header.block = blknum;
293+
header.compressed_size = do_compress(compressed_page, BLCKSZ,
294+
page, BLCKSZ, compress_alg);
298295

299-
file->compress_alg = compress_alg;
296+
file->compress_alg = compress_alg;
300297

301-
Assert (header.compressed_size <= BLCKSZ);
302-
write_buffer_size = sizeof(header);
298+
Assert (header.compressed_size <= BLCKSZ);
299+
write_buffer_size = sizeof(header);
300+
}
303301

304302
/* The page was successfully compressed */
305303
if (header.compressed_size > 0)
@@ -309,13 +307,18 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
309307
write_buffer_size += MAXALIGN(header.compressed_size);
310308
}
311309
/* The page compression failed. Write it as is. */
312-
else
310+
else if (header.compressed_size == 0)
313311
{
314312
header.compressed_size = BLCKSZ;
315313
memcpy(write_buffer, &header, sizeof(header));
316314
memcpy(write_buffer + sizeof(header), page, BLCKSZ);
317315
write_buffer_size += header.compressed_size;
318316
}
317+
/* The page is not found, it mean that it was truncated. */
318+
else if (header.compressed_size == -1)
319+
{
320+
memcpy(write_buffer, &header, sizeof(header));
321+
}
319322

320323
/* Update CRC */
321324
COMP_CRC32C(*crc, &write_buffer, write_buffer_size);
@@ -589,7 +592,16 @@ restore_data_file(const char *from_root,
589592
elog(ERROR, "cannot seek block %u of \"%s\": %s",
590593
blknum, to_path, strerror(errno));
591594

592-
if (header.compressed_size < BLCKSZ)
595+
if (header.compressed_size == -1)
596+
{
597+
/*
598+
* Backup contains information that this block was truncated.
599+
* Truncate file to this length.
600+
*/
601+
ftruncate(out, blknum * BLCKSZ);
602+
break;
603+
}
604+
else if (header.compressed_size < BLCKSZ)
593605
{
594606
if (fwrite(page.data, 1, BLCKSZ, out) != BLCKSZ)
595607
elog(ERROR, "cannot write block %u of \"%s\": %s",

0 commit comments

Comments
 (0)