@@ -25,7 +25,7 @@ use minimizer_bucketing::resplit_bucket::RewriteBucketCompute;
2525use minimizer_bucketing:: { MinimizerBucketMode , MinimizerBucketingExecutorFactory } ;
2626use parallel_processor:: buckets:: bucket_writer:: BucketItemSerializer ;
2727use parallel_processor:: buckets:: readers:: async_binary_reader:: {
28- AsyncBinaryReader , AsyncReaderThread ,
28+ AllowedCheckpointStrategy , AsyncBinaryReader , AsyncReaderThread ,
2929} ;
3030use parallel_processor:: buckets:: writers:: compressed_binary_writer:: CompressedBinaryWriter ;
3131use parallel_processor:: buckets:: LockFreeBucket ;
@@ -118,9 +118,9 @@ enum AddressMode {
118118struct BucketsInfo {
119119 readers : Vec < AsyncBinaryReader > ,
120120 concurrency : usize ,
121- addresses : Vec < AddressMode > ,
121+ addresses : Arc < Vec < AddressMode > > ,
122122 register_addresses : Vec < ExecutorAddress > ,
123- buckets_remapping : Vec < usize > ,
123+ buckets_remapping : Arc < Vec < usize > > ,
124124 second_buckets_log_max : usize ,
125125 total_file_size : usize ,
126126 used_hash_bits : usize ,
@@ -331,9 +331,9 @@ impl<F: KmersTransformExecutorFactory> KmersTransformReader<F> {
331331 BucketsInfo {
332332 readers,
333333 concurrency,
334- addresses,
334+ addresses : Arc :: new ( addresses ) ,
335335 register_addresses,
336- buckets_remapping,
336+ buckets_remapping : Arc :: new ( buckets_remapping ) ,
337337 second_buckets_log_max,
338338 total_file_size,
339339 used_hash_bits : file. used_hash_bits ,
@@ -426,7 +426,10 @@ impl<F: KmersTransformExecutorFactory> KmersTransformReader<F> {
426426 }
427427
428428 let data_format: MinimizerBucketMode = reader. get_data_format_info ( ) . unwrap ( ) ;
429- let mut checkpoint_rewrite_bucket = None ;
429+ let mut checkpoint_rewrite_info;
430+
431+ let addresses_passtrough_check = bucket_info. addresses . clone ( ) ;
432+ let buckets_remapping_passtrough_check = bucket_info. buckets_remapping . clone ( ) ;
430433
431434 creads_helper ! {
432435 helper_read_bucket_with_opt_multiplicity:: <
@@ -437,12 +440,29 @@ impl<F: KmersTransformExecutorFactory> KmersTransformReader<F> {
437440 reader,
438441 async_reader_thread. clone( ) ,
439442 matches!( data_format, MinimizerBucketMode :: Compacted ) ,
440- |checkpoint_data| { checkpoint_rewrite_bucket = checkpoint_data. map( |d| d. target_subbucket) ; } ,
443+ AllowedCheckpointStrategy :: AllowPasstrough ( Arc :: new( move |data| {
444+ if let Some ( data) = data {
445+ matches!( & addresses_passtrough_check[ buckets_remapping_passtrough_check[ data. target_subbucket as usize ] ] , AddressMode :: Rewrite ( _, _, _) )
446+ } else {
447+ false
448+ }
449+ } ) ) ,
450+ |passtrough| {
451+ let bucket = checkpoint_rewrite_info. unwrap( ) . target_subbucket as usize ;
452+ let sequences_count = checkpoint_rewrite_info. unwrap( ) . sequences_count;
453+ if let AddressMode :: Rewrite ( writer, out_sequences_count, _) = & bucket_info. addresses[ bucket_info. buckets_remapping[ bucket] ] {
454+ out_sequences_count. fetch_add( sequences_count as u64 , Ordering :: Relaxed ) ;
455+ writer. set_checkpoint_data:: <( ) >( None , Some ( passtrough) ) ;
456+ } else {
457+ unreachable!( ) ;
458+ }
459+ } ,
460+ |checkpoint_data| { checkpoint_rewrite_info = checkpoint_data; } ,
441461 |read_info, extra_buffer| {
442462 let bucket = if has_single_addr {
443463 0
444464 } else {
445- let orig_bucket = checkpoint_rewrite_bucket
465+ let orig_bucket = checkpoint_rewrite_info . map ( |i| i . target_subbucket )
446466 . unwrap_or_else( || F :: PreprocessorType :: get_rewrite_bucket(
447467 global_extra_data. get_k( ) ,
448468 global_extra_data. get_m( ) ,
@@ -620,7 +640,10 @@ impl<F: KmersTransformExecutorFactory> AsyncExecutor for KmersTransformReader<F>
620640 spawner. executors_await ( ) . await ;
621641 drop ( spawner) ;
622642
623- for addr in buckets_info. addresses {
643+ for addr in Arc :: try_unwrap ( buckets_info. addresses )
644+ . map_err ( |_| ( ) )
645+ . unwrap ( )
646+ {
624647 if let AddressMode :: Rewrite ( writer, seq_count, init_data) = addr {
625648 let new_bucket_address =
626649 KmersTransformReader :: < F > :: generate_new_address ( ( ) ) ;
0 commit comments