Skip to content

Commit ec53b1b

Browse files
committed
Merge branch 'PGPROEE9_6_CFS_385' of gitlab.postgrespro.ru:pgpro-dev/postgrespro into PGPROEE9_6_CFS_385
2 parents 136c783 + ad263d1 commit ec53b1b

File tree

1 file changed

+21
-16
lines changed
  • src/backend/storage/file

1 file changed

+21
-16
lines changed

src/backend/storage/file/cfs.c

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -935,7 +935,7 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
935935
uint32 second_pass_bytes = 0;
936936
inode_t** inodes = (inode_t**)palloc(RELSEG_SIZE*sizeof(inode_t*));
937937
bool remove_backups = true;
938-
bool second_pass_whole = false;
938+
int second_pass_whole = 0;
939939
int n_pages, n_pages1;
940940
TimestampTz startTime, secondTime, endTime;
941941
long secs, secs2;
@@ -984,13 +984,16 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
984984
goto Cleanup;
985985
}
986986

987+
cfs_state->gc_stat.processedFiles += 1;
988+
cfs_gc_processed_segments += 1;
989+
987990
/* temporary lock file for fetching map snapshot */
988991
cfs_gc_lock(lock);
989992

990993
/* Reread variables after locking file */
991994
virtSize = pg_atomic_read_u32(&map->hdr.virtSize);
992995
n_pages = virtSize / BLCKSZ;
993-
996+
retry:
994997
for (i = 0; i < n_pages; i++)
995998
{
996999
newMap->inodes[i] = map->inodes[i];
@@ -1000,9 +1003,6 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
10001003
/* may unlock until second phase */
10011004
cfs_gc_unlock(lock);
10021005

1003-
cfs_state->gc_stat.processedFiles += 1;
1004-
cfs_gc_processed_segments += 1;
1005-
10061006
if (!cfs_copy_inodes(inodes, n_pages, fd, fd2, &writeback, &newSize,
10071007
file_path, file_bck_path))
10081008
goto Cleanup;
@@ -1028,6 +1028,8 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
10281028
n_pages1 = n_pages;
10291029
virtSize = pg_atomic_read_u32(&map->hdr.virtSize);
10301030
n_pages = virtSize / BLCKSZ;
1031+
second_pass = 0;
1032+
second_pass_bytes = 0;
10311033

10321034
for (i = 0; i < n_pages; i++)
10331035
{
@@ -1048,16 +1050,13 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
10481050
second_pass++;
10491051
}
10501052

1051-
if (n_pages1 > n_pages)
1053+
/* if file were truncated (vacuum???), clean a bit */
1054+
for (i = n_pages; i < n_pages1; i++)
10521055
{
1053-
/* if file were truncated (vacuum???), clean a bit */
1054-
for (i = n_pages; i < n_pages1; i++)
1055-
{
1056-
inode_t nnode = newMap->inodes[i];
1057-
if (CFS_INODE_SIZE(nnode) != 0) {
1058-
newUsed -= CFS_INODE_SIZE(nnode);
1059-
newMap->inodes[i] = CFS_INODE(0, 0);
1060-
}
1056+
inode_t nnode = newMap->inodes[i];
1057+
if (CFS_INODE_SIZE(nnode) != 0) {
1058+
newUsed -= CFS_INODE_SIZE(nnode);
1059+
newMap->inodes[i] = CFS_INODE(0, 0);
10611060
}
10621061
}
10631062

@@ -1069,10 +1068,16 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
10691068
newUsed = 0;
10701069
newSize = 0;
10711070
writeback = 0;
1072-
second_pass_whole = true;
1071+
second_pass_whole++;
10731072
rc = lseek(fd2, 0, SEEK_SET);
10741073
Assert(rc == 0);
10751074
memset(newMap->inodes, 0, sizeof(newMap->inodes));
1075+
elog(LOG, "CFS: retry %d whole gc file %s", second_pass_whole,
1076+
file_path);
1077+
if (second_pass_whole == 1)
1078+
{
1079+
goto retry;
1080+
}
10761081
for (i = 0; i < n_pages; i++)
10771082
{
10781083
newMap->inodes[i] = map->inodes[i];
@@ -1089,7 +1094,7 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
10891094

10901095
pg_flush_data(fd2, writeback, newSize);
10911096

1092-
if (second_pass_whole)
1097+
if (second_pass_whole != 0)
10931098
{
10941099
/* truncate file to copied size */
10951100
if (ftruncate(fd2, newSize))

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy