@@ -7,6 +7,7 @@ use std::{
7
7
use tarantool:: fiber:: {
8
8
self , fiber_yield, is_cancelled, sleep, Cond , Fiber , FiberAttr
9
9
} ;
10
+ use tarantool:: { space, transaction, error:: { Error , TransactionError } } ;
10
11
11
12
pub fn test_fiber_new ( ) {
12
13
let mut fiber = Fiber :: new ( "test_fiber" , & mut |_| 0 ) ;
@@ -327,3 +328,41 @@ pub fn test_multiple_unit_deferred() {
327
328
let res = res. borrow ( ) . iter ( ) . copied ( ) . collect :: < Vec < _ > > ( ) ;
328
329
assert_eq ! ( res, vec![ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] ) ;
329
330
}
331
+
332
+ pub fn immediate_yields ( ) {
333
+ let mut space = space:: Space :: find ( "test_s1" ) . unwrap ( ) ;
334
+ space. truncate ( ) . unwrap ( ) ;
335
+
336
+ let mut fib = None ;
337
+
338
+ let result = transaction:: start_transaction ( || -> Result < ( ) , Error > {
339
+ space. insert ( & ( 1 , "test" . to_string ( ) ) ) ?;
340
+ fib = Some ( fiber:: start ( || 69 ) ) ;
341
+ Ok ( ( ) )
342
+ } ) ;
343
+
344
+ assert ! ( matches!(
345
+ result,
346
+ Err ( Error :: Transaction ( TransactionError :: FailedToCommit ) ) ,
347
+ ) ) ;
348
+
349
+ assert_eq ! ( fib. map( |f| f. join( ) ) , Some ( 69 ) )
350
+ }
351
+
352
+ pub fn deferred_doesnt_yield ( ) {
353
+ let mut space = space:: Space :: find ( "test_s1" ) . unwrap ( ) ;
354
+ space. truncate ( ) . unwrap ( ) ;
355
+
356
+ let mut fib = None ;
357
+
358
+ let result = transaction:: start_transaction ( || -> Result < ( ) , Error > {
359
+ space. insert ( & ( 1 , "test" . to_string ( ) ) ) ?;
360
+ fib = Some ( fiber:: defer ( || 69 ) ) ;
361
+ Ok ( ( ) )
362
+ } ) ;
363
+
364
+ assert ! ( result. is_ok( ) ) ;
365
+
366
+ assert ! ( matches!( fib. map( |f| f. join( ) ) , Some ( Ok ( 69 ) ) ) )
367
+ }
368
+
0 commit comments