@@ -935,7 +935,7 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
935935uint32 second_pass_bytes = 0 ;
936936inode_t * * inodes = (inode_t * * )palloc (RELSEG_SIZE * sizeof (inode_t * ));
937937bool remove_backups = true;
938- bool second_pass_whole = false ;
938+ int second_pass_whole = 0 ;
939939int n_pages ,n_pages1 ;
940940TimestampTz startTime ,secondTime ,endTime ;
941941long secs ,secs2 ;
@@ -984,13 +984,16 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
984984gotoCleanup ;
985985}
986986
987+ cfs_state -> gc_stat .processedFiles += 1 ;
988+ cfs_gc_processed_segments += 1 ;
989+
987990/* temporary lock file for fetching map snapshot */
988991cfs_gc_lock (lock );
989992
990993/* Reread variables after locking file */
991994virtSize = pg_atomic_read_u32 (& map -> hdr .virtSize );
992995n_pages = virtSize /BLCKSZ ;
993-
996+ retry :
994997for (i = 0 ;i < n_pages ;i ++ )
995998{
996999newMap -> 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 */
10011004cfs_gc_unlock (lock );
10021005
1003- cfs_state -> gc_stat .processedFiles += 1 ;
1004- cfs_gc_processed_segments += 1 ;
1005-
10061006if (!cfs_copy_inodes (inodes ,n_pages ,fd ,fd2 ,& writeback ,& newSize ,
10071007file_path ,file_bck_path ))
10081008gotoCleanup ;
@@ -1028,6 +1028,8 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
10281028n_pages1 = n_pages ;
10291029virtSize = pg_atomic_read_u32 (& map -> hdr .virtSize );
10301030n_pages = virtSize /BLCKSZ ;
1031+ second_pass = 0 ;
1032+ second_pass_bytes = 0 ;
10311033
10321034for (i = 0 ;i < n_pages ;i ++ )
10331035{
@@ -1069,10 +1071,16 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
10691071newUsed = 0 ;
10701072newSize = 0 ;
10711073writeback = 0 ;
1072- second_pass_whole = true ;
1074+ second_pass_whole ++ ;
10731075rc = lseek (fd2 ,0 ,SEEK_SET );
10741076Assert (rc == 0 );
10751077memset (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+ gotoretry ;
1083+ }
10761084for (i = 0 ;i < n_pages ;i ++ )
10771085{
10781086newMap -> inodes [i ]= map -> inodes [i ];
@@ -1089,7 +1097,7 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
10891097
10901098pg_flush_data (fd2 ,writeback ,newSize );
10911099
1092- if (second_pass_whole )
1100+ if (second_pass_whole != 0 )
10931101{
10941102/* truncate file to copied size */
10951103if (ftruncate (fd2 ,newSize ))