Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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)