@@ -9,7 +9,9 @@ use std::{
99 time:: Duration ,
1010} ;
1111
12- use anyhow:: { anyhow, Context as anyhowctx} ;
12+ use tokio:: time:: timeout;
13+
14+ use anyhow:: { anyhow, Context as anyhowctx, Error } ;
1315use arrow:: {
1416 array:: RecordBatch ,
1517 datatypes:: SchemaRef ,
@@ -53,6 +55,7 @@ use tokio::{
5355use tonic:: transport:: Channel ;
5456use url:: Url ;
5557
58+ use crate :: result:: DDError ;
5659use crate :: {
5760 logging:: { debug, error, trace} ,
5861 protobuf:: StageAddrs ,
@@ -76,43 +79,47 @@ impl Spawner {
7679 Self { runtime }
7780 }
7881
82+ // wait_for_future can be dc
7983 fn wait_for_future < F > ( & self , f : F , name : & str ) -> Result < F :: Output >
8084 where
8185 F : Future + Send + ' static ,
8286 F :: Output : Send ,
8387 {
88+ if Handle :: try_current ( ) . is_ok ( ) {
89+ panic ! ( "cannot call wait_for_future within an async runtime" )
90+ }
91+
8492 let name_c = name. to_owned ( ) ;
8593 trace ! ( "Spawner::wait_for {name_c}" ) ;
86- let ( tx, rx) = std :: sync:: mpsc:: channel :: < F :: Output > ( ) ;
94+ let ( tx, mut rx) = tokio :: sync:: mpsc:: channel :: < F :: Output > ( 1 ) ;
8795
88- let func = move || {
96+ // Let's not drop the tx.
97+ let func = async move || {
8998 trace ! ( "spawned fut start {name_c}" ) ;
9099
91- let out = Handle :: current ( ) . block_on ( f ) ;
100+ let out = f . await ;
92101 trace ! ( "spawned fut stop {name_c}" ) ;
93- tx. send ( out) . inspect_err ( |e| {
94- error ! ( "ERROR sending future reesult over channel!!!! {e:?}" ) ;
95- } )
102+ let result = tx. send ( out) . await ;
103+ if let Err ( e) = result {
104+ error ! ( "ERROR sending future result over channel!!!! {e:?}" ) ;
105+ }
106+ // tx is dropped
96107 } ;
97108
98109 {
99110 let _guard = self . runtime . enter ( ) ;
100- let handle = Handle :: current ( ) ;
101-
102- trace ! ( "Spawner spawning {name}" ) ;
103- handle. spawn_blocking ( func) ;
104- trace ! ( "Spawner spawned {name}" ) ;
111+ trace ! ( "Spawner spawning {name} (sync)" ) ;
112+ tokio:: spawn ( func ( ) ) ;
113+ trace ! ( "Spawner spawned {name} (sync)" ) ;
105114 }
106115
107- let out = rx
108- . recv_timeout ( Duration :: from_secs ( 5 ) )
109- . inspect_err ( |e| {
110- error ! ( "Spawner::wait_for {name} timed out waiting for future result: {e:?}" ) ;
111- } )
112- . context ( "Spawner::wait_for failed to receive future result" ) ?;
116+ let result = rx. blocking_recv ( ) ;
117+ if result. is_none ( ) {
118+ error ! ( "Spawner::wait_for {name} timed out waiting for future result" ) ;
119+ return Err ( DDError :: Other ( anyhow ! ( "blah" ) ) ) ;
120+ }
113121
114- debug ! ( "Spawner::wait_for {name} returning" ) ;
115- Ok ( out)
122+ Ok ( result. unwrap ( ) )
116123 }
117124}
118125
@@ -652,21 +659,21 @@ mod test {
652659 assert_eq ! ( out, 5 ) ;
653660 }
654661
655- #[ test]
656- fn test_wait_for_nested ( ) {
657- println ! ( "test_wait_for_nested" ) ;
658- let fut = async || {
659- println ! ( "in outter fut" ) ;
660- let fut5 = async || {
661- println ! ( "in inner fut" ) ;
662- 5
663- } ;
664- wait_for ( fut5 ( ) , "inner" ) . unwrap ( )
665- } ;
666-
667- let out = wait_for ( fut ( ) , "outer" ) . unwrap ( ) ;
668- assert_eq ! ( out, 5 ) ;
669- }
662+ // #[test]
663+ // fn test_wait_for_nested() {
664+ // println!("test_wait_for_nested");
665+ // let fut = async || {
666+ // println!("in outter fut");
667+ // let fut5 = async || {
668+ // println!("in inner fut");
669+ // 5
670+ // };
671+ // wait_for(fut5(), "inner").unwrap()
672+ // };
673+ //
674+ // let out = wait_for(fut(), "outer").unwrap();
675+ // assert_eq!(out, 5);
676+ // }
670677
671678 #[ test( tokio:: test) ]
672679 async fn test_max_rows_stream ( ) {
0 commit comments