Skip to content

Commit 68060e7

Browse files
alubennikovaza-arthur
authored andcommitted
fix race in make_pagemap_from_ptrack() for segments created after we've read ptrack
1 parent 92b7cc9 commit 68060e7

File tree

1 file changed

+21
-8
lines changed

1 file changed

+21
-8
lines changed

src/backup.c

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2407,19 +2407,32 @@ make_pagemap_from_ptrack(parray *files)
24072407
*/
24082408
start_addr = (RELSEG_SIZE/HEAPBLOCKS_PER_BYTE)*file->segno;
24092409

2410-
if (start_addr + RELSEG_SIZE/HEAPBLOCKS_PER_BYTE > ptrack_nonparsed_size)
2410+
/*
2411+
* If file segment was created after we have read ptrack,
2412+
* we won't have a bitmap for this segment.
2413+
*/
2414+
if (start_addr > ptrack_nonparsed_size)
24112415
{
2412-
file->pagemap.bitmapsize = ptrack_nonparsed_size - start_addr;
2413-
elog(VERBOSE, "pagemap size: %i", file->pagemap.bitmapsize);
2416+
elog(VERBOSE, "Ptrack is missing for file: %s", file->path);
2417+
file->pagemap_isabsent = true;
24142418
}
24152419
else
24162420
{
2417-
file->pagemap.bitmapsize = RELSEG_SIZE/HEAPBLOCKS_PER_BYTE;
2418-
elog(VERBOSE, "pagemap size: %i", file->pagemap.bitmapsize);
2419-
}
24202421

2421-
file->pagemap.bitmap = pg_malloc(file->pagemap.bitmapsize);
2422-
memcpy(file->pagemap.bitmap, ptrack_nonparsed+start_addr, file->pagemap.bitmapsize);
2422+
if (start_addr + RELSEG_SIZE/HEAPBLOCKS_PER_BYTE > ptrack_nonparsed_size)
2423+
{
2424+
file->pagemap.bitmapsize = ptrack_nonparsed_size - start_addr;
2425+
elog(VERBOSE, "pagemap size: %i", file->pagemap.bitmapsize);
2426+
}
2427+
else
2428+
{
2429+
file->pagemap.bitmapsize = RELSEG_SIZE/HEAPBLOCKS_PER_BYTE;
2430+
elog(VERBOSE, "pagemap size: %i", file->pagemap.bitmapsize);
2431+
}
2432+
2433+
file->pagemap.bitmap = pg_malloc(file->pagemap.bitmapsize);
2434+
memcpy(file->pagemap.bitmap, ptrack_nonparsed+start_addr, file->pagemap.bitmapsize);
2435+
}
24232436
}
24242437
else
24252438
{

0 commit comments

Comments
 (0)