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

Commit 8eba6d2

Browse files
author
Sokolov Yura
committed
cfs: if too many pages dirtied, first time try redo lockless first pass.
1 parent a25d308 commit 8eba6d2

File tree

1 file changed

+15
-7
lines changed
  • src/backend/storage/file

1 file changed

+15
-7
lines changed

src/backend/storage/file/cfs.c

Lines changed: 15 additions & 7 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
{
@@ -1069,10 +1071,16 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
10691071
newUsed = 0;
10701072
newSize = 0;
10711073
writeback = 0;
1072-
second_pass_whole = true;
1074+
second_pass_whole++;
10731075
rc = lseek(fd2, 0, SEEK_SET);
10741076
Assert(rc == 0);
10751077
memset(newMap->inodes, 0, sizeof(newMap->inodes));
1078+
elog(LOG, "CFS: retry %d whole gc file %s", second_pass_whole,
1079+
file_path);
1080+
if (second_pass_whole == 1)
1081+
{
1082+
goto retry;
1083+
}
10761084
for (i = 0; i < n_pages; i++)
10771085
{
10781086
newMap->inodes[i] = map->inodes[i];
@@ -1089,7 +1097,7 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
10891097

10901098
pg_flush_data(fd2, writeback, newSize);
10911099

1092-
if (second_pass_whole)
1100+
if (second_pass_whole != 0)
10931101
{
10941102
/* truncate file to copied size */
10951103
if (ftruncate(fd2, newSize))

0 commit comments

Comments
 (0)