11use std:: {
22 borrow:: Borrow ,
3- cmp:: max,
43 env,
54 path:: PathBuf ,
65 sync:: { Arc , LazyLock , Mutex , PoisonError , Weak } ,
76} ;
87
98use anyhow:: { Context , Result , anyhow} ;
10- use rayon:: iter:: { IndexedParallelIterator , IntoParallelIterator , ParallelIterator } ;
119use serde:: { Deserialize , Serialize } ;
1210use smallvec:: SmallVec ;
13- use tracing:: Span ;
1411use turbo_tasks:: {
1512 SessionId , TaskId ,
1613 backend:: CachedTaskType ,
1714 panic_hooks:: { PanicHookGuard , register_panic_hook} ,
18- turbo_tasks_scope ,
15+ parallel ,
1916} ;
2017
2118use crate :: {
@@ -331,14 +328,15 @@ impl<T: KeyValueDatabase + Send + Sync + 'static> BackingStorageSealed
331328 let _span = tracing:: trace_span!( "update task data" ) . entered ( ) ;
332329 process_task_data ( snapshots, Some ( batch) ) ?;
333330 let span = tracing:: trace_span!( "flush task data" ) . entered ( ) ;
334- [ KeySpace :: TaskMeta , KeySpace :: TaskData ]
335- . into_par_iter ( )
336- . try_for_each ( | key_space| {
331+ parallel :: try_for_each (
332+ & [ KeySpace :: TaskMeta , KeySpace :: TaskData ] ,
333+ | & key_space| {
337334 let _span = span. clone ( ) . entered ( ) ;
338335 // Safety: We already finished all processing of the task data and task
339336 // meta
340337 unsafe { batch. flush ( key_space) }
341- } ) ?;
338+ } ,
339+ ) ?;
342340 }
343341
344342 let mut next_task_id = get_next_free_task_id :: <
@@ -352,10 +350,9 @@ impl<T: KeyValueDatabase + Send + Sync + 'static> BackingStorageSealed
352350 items = task_cache_updates. iter( ) . map( |m| m. len( ) ) . sum:: <usize >( )
353351 )
354352 . entered ( ) ;
355- let result = task_cache_updates
356- . into_par_iter ( )
357- . with_max_len ( 1 )
358- . map ( |updates| {
353+ let result = parallel:: map_collect_owned :: < _ , _ , Result < Vec < _ > > > (
354+ task_cache_updates,
355+ |updates| {
359356 let _span = _span. clone ( ) . entered ( ) ;
360357 let mut max_task_id = 0 ;
361358
@@ -390,15 +387,11 @@ impl<T: KeyValueDatabase + Send + Sync + 'static> BackingStorageSealed
390387 }
391388
392389 Ok ( max_task_id)
393- } )
394- . reduce (
395- || Ok ( 0 ) ,
396- |a, b| -> anyhow:: Result < _ > {
397- let a_max = a?;
398- let b_max = b?;
399- Ok ( max ( a_max, b_max) )
400- } ,
401- ) ?;
390+ } ,
391+ ) ?
392+ . into_iter ( )
393+ . max ( )
394+ . unwrap_or ( 0 ) ;
402395 next_task_id = next_task_id. max ( result) ;
403396 }
404397
@@ -410,64 +403,11 @@ impl<T: KeyValueDatabase + Send + Sync + 'static> BackingStorageSealed
410403 ) ?;
411404 }
412405 WriteBatch :: Serial ( batch) => {
413- let mut task_items_result = Ok ( Vec :: new ( ) ) ;
414- turbo_tasks:: scope ( |s| {
415- s. spawn ( |_| {
416- task_items_result =
417- process_task_data ( snapshots, None :: < & T :: ConcurrentWriteBatch < ' _ > > ) ;
418- } ) ;
419-
420- let mut next_task_id =
421- get_next_free_task_id :: <
422- T :: SerialWriteBatch < ' _ > ,
423- T :: ConcurrentWriteBatch < ' _ > ,
424- > ( & mut WriteBatchRef :: serial ( batch) ) ?;
425-
426- {
427- let _span = tracing:: trace_span!(
428- "update task cache" ,
429- items = task_cache_updates. iter( ) . map( |m| m. len( ) ) . sum:: <usize >( )
430- )
431- . entered ( ) ;
432- let mut task_type_bytes = Vec :: new ( ) ;
433- for ( task_type, task_id) in task_cache_updates. into_iter ( ) . flatten ( ) {
434- let task_id = * task_id;
435- serialize_task_type ( & task_type, & mut task_type_bytes, task_id) ?;
436-
437- batch
438- . put (
439- KeySpace :: ForwardTaskCache ,
440- WriteBuffer :: Borrowed ( & task_type_bytes) ,
441- WriteBuffer :: Borrowed ( & task_id. to_le_bytes ( ) ) ,
442- )
443- . with_context ( || {
444- anyhow ! ( "Unable to write task cache {task_type:?} => {task_id}" )
445- } ) ?;
446- batch
447- . put (
448- KeySpace :: ReverseTaskCache ,
449- WriteBuffer :: Borrowed ( IntKey :: new ( task_id) . as_ref ( ) ) ,
450- WriteBuffer :: Borrowed ( & task_type_bytes) ,
451- )
452- . with_context ( || {
453- anyhow ! ( "Unable to write task cache {task_id} => {task_type:?}" )
454- } ) ?;
455- next_task_id = next_task_id. max ( task_id + 1 ) ;
456- }
457- }
458-
459- save_infra :: < T :: SerialWriteBatch < ' _ > , T :: ConcurrentWriteBatch < ' _ > > (
460- & mut WriteBatchRef :: serial ( batch) ,
461- next_task_id,
462- session_id,
463- operations,
464- ) ?;
465- anyhow:: Ok ( ( ) )
466- } ) ?;
467-
468406 {
469407 let _span = tracing:: trace_span!( "update tasks" ) . entered ( ) ;
470- for ( task_id, meta, data) in task_items_result?. into_iter ( ) . flatten ( ) {
408+ let task_items =
409+ process_task_data ( snapshots, None :: < & T :: ConcurrentWriteBatch < ' _ > > ) ?;
410+ for ( task_id, meta, data) in task_items. into_iter ( ) . flatten ( ) {
471411 let key = IntKey :: new ( * task_id) ;
472412 let key = key. as_ref ( ) ;
473413 if let Some ( meta) = meta {
@@ -485,7 +425,54 @@ impl<T: KeyValueDatabase + Send + Sync + 'static> BackingStorageSealed
485425 } ) ?;
486426 }
487427 }
428+ batch. flush ( KeySpace :: TaskMeta ) ?;
429+ batch. flush ( KeySpace :: TaskData ) ?;
430+ }
431+
432+ let mut next_task_id = get_next_free_task_id :: <
433+ T :: SerialWriteBatch < ' _ > ,
434+ T :: ConcurrentWriteBatch < ' _ > ,
435+ > ( & mut WriteBatchRef :: serial ( batch) ) ?;
436+
437+ {
438+ let _span = tracing:: trace_span!(
439+ "update task cache" ,
440+ items = task_cache_updates. iter( ) . map( |m| m. len( ) ) . sum:: <usize >( )
441+ )
442+ . entered ( ) ;
443+ let mut task_type_bytes = Vec :: new ( ) ;
444+ for ( task_type, task_id) in task_cache_updates. into_iter ( ) . flatten ( ) {
445+ let task_id = * task_id;
446+ serialize_task_type ( & task_type, & mut task_type_bytes, task_id) ?;
447+
448+ batch
449+ . put (
450+ KeySpace :: ForwardTaskCache ,
451+ WriteBuffer :: Borrowed ( & task_type_bytes) ,
452+ WriteBuffer :: Borrowed ( & task_id. to_le_bytes ( ) ) ,
453+ )
454+ . with_context ( || {
455+ anyhow ! ( "Unable to write task cache {task_type:?} => {task_id}" )
456+ } ) ?;
457+ batch
458+ . put (
459+ KeySpace :: ReverseTaskCache ,
460+ WriteBuffer :: Borrowed ( IntKey :: new ( task_id) . as_ref ( ) ) ,
461+ WriteBuffer :: Borrowed ( & task_type_bytes) ,
462+ )
463+ . with_context ( || {
464+ anyhow ! ( "Unable to write task cache {task_id} => {task_type:?}" )
465+ } ) ?;
466+ next_task_id = next_task_id. max ( task_id + 1 ) ;
467+ }
488468 }
469+
470+ save_infra :: < T :: SerialWriteBatch < ' _ > , T :: ConcurrentWriteBatch < ' _ > > (
471+ & mut WriteBatchRef :: serial ( batch) ,
472+ next_task_id,
473+ session_id,
474+ operations,
475+ ) ?;
489476 }
490477 }
491478
@@ -703,48 +690,38 @@ where
703690 > + Send
704691 + Sync ,
705692{
706- let span = Span :: current ( ) ;
707- let turbo_tasks = turbo_tasks:: turbo_tasks ( ) ;
708- let handle = tokio:: runtime:: Handle :: current ( ) ;
709- tasks
710- . into_par_iter ( )
711- . map ( |tasks| {
712- let _span = span. clone ( ) . entered ( ) ;
713- let _guard = handle. clone ( ) . enter ( ) ;
714- turbo_tasks_scope ( turbo_tasks. clone ( ) , || {
715- let mut result = Vec :: new ( ) ;
716- for ( task_id, meta, data) in tasks {
717- if let Some ( batch) = batch {
718- let key = IntKey :: new ( * task_id) ;
719- let key = key. as_ref ( ) ;
720- if let Some ( meta) = meta {
721- batch. put (
722- KeySpace :: TaskMeta ,
723- WriteBuffer :: Borrowed ( key) ,
724- WriteBuffer :: SmallVec ( meta) ,
725- ) ?;
726- }
727- if let Some ( data) = data {
728- batch. put (
729- KeySpace :: TaskData ,
730- WriteBuffer :: Borrowed ( key) ,
731- WriteBuffer :: SmallVec ( data) ,
732- ) ?;
733- }
734- } else {
735- // Store the new task data
736- result. push ( (
737- task_id,
738- meta. map ( WriteBuffer :: SmallVec ) ,
739- data. map ( WriteBuffer :: SmallVec ) ,
740- ) ) ;
741- }
693+ parallel:: map_collect_owned :: < _ , _ , Result < Vec < _ > > > ( tasks, |tasks| {
694+ let mut result = Vec :: new ( ) ;
695+ for ( task_id, meta, data) in tasks {
696+ if let Some ( batch) = batch {
697+ let key = IntKey :: new ( * task_id) ;
698+ let key = key. as_ref ( ) ;
699+ if let Some ( meta) = meta {
700+ batch. put (
701+ KeySpace :: TaskMeta ,
702+ WriteBuffer :: Borrowed ( key) ,
703+ WriteBuffer :: SmallVec ( meta) ,
704+ ) ?;
705+ }
706+ if let Some ( data) = data {
707+ batch. put (
708+ KeySpace :: TaskData ,
709+ WriteBuffer :: Borrowed ( key) ,
710+ WriteBuffer :: SmallVec ( data) ,
711+ ) ?;
742712 }
713+ } else {
714+ // Store the new task data
715+ result. push ( (
716+ task_id,
717+ meta. map ( WriteBuffer :: SmallVec ) ,
718+ data. map ( WriteBuffer :: SmallVec ) ,
719+ ) ) ;
720+ }
721+ }
743722
744- Ok ( result)
745- } )
746- } )
747- . collect :: < Result < Vec < _ > > > ( )
723+ Ok ( result)
724+ } )
748725}
749726
750727fn serialize ( task : TaskId , data : & Vec < CachedDataItem > ) -> Result < SmallVec < [ u8 ; 16 ] > > {
0 commit comments