@@ -18,15 +18,13 @@ use common::{
1818 bounded_thread_pool:: BoundedThreadPool ,
1919 id_tracker:: StaticIdTracker ,
2020 persistence:: DocumentRevisionStream ,
21- runtime:: Runtime ,
21+ runtime:: {
22+ try_join_buffer_unordered,
23+ Runtime ,
24+ } ,
2225 types:: ObjectKey ,
2326} ;
24- use futures:: {
25- stream,
26- FutureExt ,
27- StreamExt ,
28- TryStreamExt ,
29- } ;
27+ use futures:: TryStreamExt ;
3028use storage:: {
3129 Storage ,
3230 StorageExt ,
@@ -303,7 +301,8 @@ impl PreviousTextSegments {
303301/// Note the descending order requirement can be relaxed if the caller can
304302/// guarantee that no deletes will be present in the stream. A caller can do so
305303/// when providing this function with a stream from table iterator for example.
306- pub async fn build_new_segment (
304+ pub async fn build_new_segment < RT : Runtime > (
305+ rt : & RT ,
307306 revision_stream : DocumentRevisionStream < ' _ > ,
308307 tantivy_schema : TantivySearchIndexSchema ,
309308 dir : & Path ,
@@ -405,6 +404,7 @@ pub async fn build_new_segment(
405404 ) ;
406405
407406 let segments_term_metadata = get_all_segment_term_metadata (
407+ rt,
408408 search_storage,
409409 segment_term_metadata_fetcher,
410410 term_deletes_by_segment,
@@ -447,7 +447,8 @@ fn get_size(path: &PathBuf) -> anyhow::Result<u64> {
447447 std:: fs:: read_dir ( path) ?. try_fold ( 0 , |acc, curr| Ok ( acc + get_size ( & curr?. path ( ) ) ?) )
448448}
449449
450- async fn get_all_segment_term_metadata (
450+ async fn get_all_segment_term_metadata < RT : Runtime > (
451+ rt : & RT ,
451452 storage : Arc < dyn Storage > ,
452453 segment_term_metadata_fetcher : Arc < dyn SegmentTermMetadataFetcher > ,
453454 term_deletes_by_segment : BTreeMap < ObjectKey , TermDeletionsByField > ,
@@ -470,12 +471,9 @@ async fn get_all_segment_term_metadata(
470471 }
471472 } ,
472473 ) ;
473- // TODO: Use `try_join_buffer_unordered` helper here. We couldn't figure out the
474- // higher-ranked lifetime error.
475- let segments_term_metadata: Vec < _ > = stream:: iter ( segment_term_metadata_futs)
476- . buffer_unordered ( 10 )
477- . try_collect :: < Vec < _ > > ( )
478- . await ?;
474+ let segments_term_metadata: Vec < _ > =
475+ try_join_buffer_unordered ( rt. clone ( ) , "text_term_metadata" , segment_term_metadata_futs)
476+ . await ?;
479477 Ok ( segments_term_metadata)
480478}
481479
@@ -545,15 +543,21 @@ pub async fn fetch_compact_and_upload_text_segment<RT: Runtime>(
545543 segments : Vec < FragmentedTextStorageKeys > ,
546544) -> anyhow:: Result < FragmentedTextSegment > {
547545 let _storage = storage. clone ( ) ;
548- let opened_segments: Vec < _ > = stream :: iter ( segments )
549- . map ( move |segment| fetch_text_segment ( cache . clone ( ) , storage . clone ( ) , segment ) . boxed ( ) )
550- . buffer_unordered ( 20 )
551- . and_then ( | paths : TextSegmentPaths | {
546+ let opened_segments = try_join_buffer_unordered (
547+ rt . clone ( ) ,
548+ "text_segment_merge" ,
549+ segments . into_iter ( ) . map ( move |segment | {
552550 let pool = blocking_thread_pool. clone ( ) ;
553- async move { pool. execute ( || open_text_segment_for_merge ( paths) ) . await ? }
554- } )
555- . try_collect ( )
556- . await ?;
551+ let storage = storage. clone ( ) ;
552+ let cache = cache. clone ( ) ;
553+ let segment = segment. clone ( ) ;
554+ async move {
555+ let paths = fetch_text_segment ( cache, storage, segment) . await ?;
556+ pool. execute ( || open_text_segment_for_merge ( paths) ) . await ?
557+ }
558+ } ) ,
559+ )
560+ . await ?;
557561
558562 let dir = TempDir :: new ( ) ?;
559563 let new_segment = merge_segments ( opened_segments, dir. path ( ) ) . await ?;
0 commit comments