@@ -44,6 +44,7 @@ use databend_storages_common_table_meta::meta::CompactSegmentInfo;
4444use databend_storages_common_table_meta:: meta:: TableSnapshot ;
4545use databend_storages_common_table_meta:: meta:: VACUUM2_OBJECT_KEY_PREFIX ;
4646use log:: info;
47+ use log:: warn;
4748use opendal:: Entry ;
4849use opendal:: ErrorKind ;
4950
@@ -612,24 +613,35 @@ async fn process_snapshot_refs(
612613 ctx : & Arc < dyn TableContext > ,
613614) -> Result < RefVacuumInfo > {
614615 let start = std:: time:: Instant :: now ( ) ;
616+ let table_info = fuse_table. get_table_info ( ) ;
617+ let mut files_to_gc = match fuse_table. cleanup_orphan_ref_dirs ( ) . await {
618+ Ok ( paths) => paths,
619+ Err ( e) => {
620+ warn ! (
621+ "Failed to clean orphan refs for table {}: {}" ,
622+ table_info. desc, e
623+ ) ;
624+ Vec :: new ( )
625+ }
626+ } ;
615627 let op = fuse_table. get_operator ( ) ;
616628 // Refs that expired and should be cleaned up
617629 let mut expired_refs = HashSet :: new ( ) ;
630+ let mut expired_ref_names = Vec :: new ( ) ;
618631 // Ref snapshot paths to be cleaned up
619632 let mut ref_snapshots_to_gc = Vec :: new ( ) ;
620633 let mut ref_gc_roots = Vec :: new ( ) ;
621634 let mut gc_root_meta_ts: Option < DateTime < Utc > > = None ;
622635 let mut gc_root_timestamp: Option < DateTime < Utc > > = None ;
623- let mut files_to_gc = Vec :: new ( ) ;
624636
625637 let now = Utc :: now ( ) ;
626638 let ( retention_time, num_snapshots_to_keep) =
627639 fuse_table. get_refs_retention_policy ( ctx. as_ref ( ) , now) ?;
628- let table_info = fuse_table. get_table_info ( ) ;
629640 // Process active refs
630641 for ( ref_name, snapshot_ref) in table_info. meta . refs . iter ( ) {
631642 if snapshot_ref. expire_at . is_some_and ( |v| v < now) {
632- expired_refs. insert ( ref_name) ;
643+ expired_refs. insert ( snapshot_ref. id ) ;
644+ expired_ref_names. push ( ref_name) ;
633645 continue ;
634646 }
635647
@@ -701,9 +713,10 @@ async fn process_snapshot_refs(
701713
702714 if !expired_refs. is_empty ( ) {
703715 let start_update = std:: time:: Instant :: now ( ) ;
704- files_to_gc = fuse_table
716+ let expired_ref_dirs = fuse_table
705717 . update_table_refs_meta ( ctx, & expired_refs)
706718 . await ?;
719+ files_to_gc. extend ( expired_ref_dirs) ;
707720 ctx. set_status_info ( & format ! (
708721 "Updated table meta for table {}, elapsed: {:?}" ,
709722 table_info. desc,
@@ -717,12 +730,11 @@ async fn process_snapshot_refs(
717730 file_op. remove_file_in_batch ( & ref_snapshots_to_gc) . await ?;
718731 }
719732
720- let expired_vec = expired_refs. into_iter ( ) . collect :: < Vec < _ > > ( ) ;
721733 ctx. set_status_info ( & format ! (
722734 "Processed snapshot refs for table {}, elapsed: {:?}, expire_refs: {}, ref_snapshots_to_gc: {}, ref_gc_root_meta_ts: {:?}" ,
723735 table_info. desc,
724736 start. elapsed( ) ,
725- slice_summary( & expired_vec ) ,
737+ slice_summary( & expired_ref_names ) ,
726738 slice_summary( & ref_snapshots_to_gc) ,
727739 gc_root_meta_ts
728740 ) ) ;
0 commit comments