@@ -1161,23 +1161,34 @@ static bool cfs_gc_file(char* map_path, GC_CALL_KIND background)
1161
1161
1162
1162
if (cfs_gc_verify_file )
1163
1163
{
1164
+ off_t soff = -1 ;
1164
1165
fd = open (file_bck_path , O_RDONLY |PG_BINARY , 0 );
1165
1166
Assert (fd >= 0 );
1166
1167
1167
1168
for (i = 0 ; i < n_pages ; i ++ )
1168
1169
{
1169
- inode_t inode = newMap -> inodes [i ];
1170
+ inodes [i ] = & newMap -> inodes [i ];
1171
+ }
1172
+ qsort (inodes , n_pages , sizeof (inode_t * ), cfs_cmp_page_offs );
1173
+
1174
+ for (i = 0 ; i < n_pages ; i ++ )
1175
+ {
1176
+ inode_t inode = * inodes [i ];
1170
1177
int size = CFS_INODE_SIZE (inode );
1171
1178
if (size != 0 && size < BLCKSZ )
1172
1179
{
1173
1180
char block [BLCKSZ ];
1174
1181
char decomressedBlock [BLCKSZ ];
1175
1182
off_t res PG_USED_FOR_ASSERTS_ONLY ;
1176
1183
bool rc PG_USED_FOR_ASSERTS_ONLY ;
1177
- res = lseek (fd , CFS_INODE_OFFS (inode ), SEEK_SET );
1178
- Assert (res == (off_t )CFS_INODE_OFFS (inode ));
1184
+ if (soff != CFS_INODE_OFFS (inode ))
1185
+ {
1186
+ soff = lseek (fd , CFS_INODE_OFFS (inode ), SEEK_SET );
1187
+ Assert (soff == (off_t )CFS_INODE_OFFS (inode ));
1188
+ }
1179
1189
rc = cfs_read_file (fd , block , size );
1180
1190
Assert (rc );
1191
+ soff += size ;
1181
1192
cfs_decrypt (file_bck_path , block , (off_t )i * BLCKSZ , size );
1182
1193
res = cfs_decompress (decomressedBlock , BLCKSZ , block , size );
1183
1194
@@ -1480,21 +1491,18 @@ void cfs_gc_start_bgworkers()
1480
1491
/* Disable garbage collection. */
1481
1492
void cfs_control_gc_lock (void )
1482
1493
{
1483
- uint32 was_disabled = pg_atomic_fetch_add_u32 (& cfs_state -> gc_disabled , 1 );
1484
- if (!was_disabled )
1494
+ pg_atomic_fetch_add_u32 (& cfs_state -> gc_disabled , 1 );
1495
+ /* Wait until there are no active GC workers */
1496
+ while (pg_atomic_read_u32 (& cfs_state -> n_active_gc ) != 0 )
1485
1497
{
1486
- /* Wait until there are no active GC workers */
1487
- while (pg_atomic_read_u32 (& cfs_state -> n_active_gc ) != 0 )
1488
- {
1489
- int rc = WaitLatch (MyLatch ,
1490
- WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH ,
1491
- CFS_DISABLE_TIMEOUT /* ms */ );
1492
- if (rc & WL_POSTMASTER_DEATH )
1493
- exit (1 );
1498
+ int rc = WaitLatch (MyLatch ,
1499
+ WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH ,
1500
+ CFS_DISABLE_TIMEOUT /* ms */ );
1501
+ if (rc & WL_POSTMASTER_DEATH )
1502
+ exit (1 );
1494
1503
1495
- ResetLatch (MyLatch );
1496
- CHECK_FOR_INTERRUPTS ();
1497
- }
1504
+ ResetLatch (MyLatch );
1505
+ CHECK_FOR_INTERRUPTS ();
1498
1506
}
1499
1507
}
1500
1508
0 commit comments