36
36
import java .util .concurrent .Executors ;
37
37
import java .util .concurrent .ScheduledExecutorService ;
38
38
import java .util .concurrent .TimeUnit ;
39
+ import java .util .concurrent .atomic .AtomicBoolean ;
39
40
40
41
import static java .util .Collections .emptyList ;
41
42
import static java .util .Collections .emptyMap ;
@@ -398,25 +399,21 @@ public Map<FileInfo, Boolean> gc()
398
399
399
400
private Map <FileInfo , Boolean > executeGC () throws Exception
400
401
{
401
- logger .info ("Run storage gc." );
402
+ logger .info ("Run storage gc... " );
402
403
Map <FileInfo , Boolean > gcResults = new HashMap <>();
403
404
while ( true )
404
405
{
405
406
int batchSize = config .getGCBatchSize ();
406
407
List <Reclaim > reclaims = pathDB .listOrphanedFiles ( batchSize );
407
408
408
409
int size = reclaims .size ();
409
- logger .info ( "Get reclaims for GC , size: {}" , size );
410
+ logger .info ( "Get reclaims for gc , size: {}" , size );
410
411
if ( size <= 0 )
411
412
{
412
- logger .info ("gc complete." );
413
- break ;
414
- }
415
- else if ( batchSize > 0 && size < batchSize )
416
- {
417
- logger .info ( "Reclaims size less than batch size {}. Break current gc." , batchSize );
413
+ logger .info ("Gc complete." );
418
414
break ;
419
415
}
416
+ final AtomicBoolean physicalStoreError = new AtomicBoolean ( false );
420
417
reclaims .forEach ( reclaim -> {
421
418
FileInfo fileInfo = new FileInfo ();
422
419
fileInfo .setFileId ( reclaim .getFileId () );
@@ -430,13 +427,20 @@ else if ( batchSize > 0 && size < batchSize )
430
427
else
431
428
{
432
429
logger .warn ( "Delete from physical store failed, fileInfo: {}, reclaim: {}" , fileInfo , reclaim );
430
+ physicalStoreError .set ( true );
433
431
}
434
432
gcResults .put (fileInfo , result );
435
433
});
434
+ if ( physicalStoreError .get () )
435
+ {
436
+ // Break to avoid infinite loop. The listOrphanedFiles may fetch duplicated entries in this case.
437
+ logger .info ("Gc hit physical store error. Break current gc. gcResults: {}" , gcResults );
438
+ break ;
439
+ }
436
440
int curSize = gcResults .size ();
437
441
if ( curSize >= config .getGcMaxResultSize () )
438
442
{
439
- logger .info ("gc reach the max result size and complete, curSize: {}" , curSize );
443
+ logger .info ("Gc reach the max result size and complete, curSize: {}" , curSize );
440
444
break ;
441
445
}
442
446
}
0 commit comments