@@ -535,10 +535,11 @@ struct FailPointRegistry {
535
535
registry : RwLock < Registry > ,
536
536
}
537
537
538
- use once_cell:: sync:: Lazy ;
538
+ use once_cell:: sync:: { Lazy , OnceCell } ;
539
539
540
- static REGISTRY : Lazy < FailPointRegistry > = Lazy :: new ( FailPointRegistry :: default) ;
541
- static SCENARIO : Lazy < Mutex < & ' static FailPointRegistry > > = Lazy :: new ( || Mutex :: new ( & REGISTRY ) ) ;
540
+ static REGISTRY : OnceCell < FailPointRegistry > = OnceCell :: new ( ) ;
541
+ static SCENARIO : Lazy < Mutex < & ' static FailPointRegistry > > =
542
+ Lazy :: new ( || Mutex :: new ( REGISTRY . get_or_init ( Default :: default) ) ) ;
542
543
543
544
/// Test scenario with configured fail points.
544
545
#[ derive( Debug ) ]
@@ -636,7 +637,11 @@ pub const fn has_failpoints() -> bool {
636
637
///
637
638
/// Return a vector of `(name, actions)` pairs.
638
639
pub fn list ( ) -> Vec < ( String , String ) > {
639
- let registry = REGISTRY . registry . read ( ) . unwrap ( ) ;
640
+ let registry = if let Some ( r) = REGISTRY . get ( ) {
641
+ r. registry . read ( ) . unwrap ( )
642
+ } else {
643
+ return Vec :: new ( ) ;
644
+ } ;
640
645
registry
641
646
. iter ( )
642
647
. map ( |( name, fp) | ( name. to_string ( ) , fp. actions_str . read ( ) . unwrap ( ) . clone ( ) ) )
@@ -645,8 +650,13 @@ pub fn list() -> Vec<(String, String)> {
645
650
646
651
#[ doc( hidden) ]
647
652
pub fn eval < R , F : FnOnce ( Option < String > ) -> R > ( name : & str , f : F ) -> Option < R > {
653
+ let registry = if let Some ( r) = REGISTRY . get ( ) {
654
+ & r. registry
655
+ } else {
656
+ return None ;
657
+ } ;
648
658
let p = {
649
- let registry = REGISTRY . registry . read ( ) . unwrap ( ) ;
659
+ let registry = registry. read ( ) . unwrap ( ) ;
650
660
match registry. get ( name) {
651
661
None => return None ,
652
662
Some ( p) => p. clone ( ) ,
@@ -686,7 +696,11 @@ pub fn eval<R, F: FnOnce(Option<String>) -> R>(name: &str, f: F) -> Option<R> {
686
696
/// A call to `cfg` with a particular fail point name overwrites any existing actions for
687
697
/// that fail point, including those set via the `FAILPOINTS` environment variable.
688
698
pub fn cfg < S : Into < String > > ( name : S , actions : & str ) -> Result < ( ) , String > {
689
- let mut registry = REGISTRY . registry . write ( ) . unwrap ( ) ;
699
+ let mut registry = REGISTRY
700
+ . get_or_init ( Default :: default)
701
+ . registry
702
+ . write ( )
703
+ . unwrap ( ) ;
690
704
set ( & mut registry, name. into ( ) , actions)
691
705
}
692
706
@@ -699,7 +713,11 @@ where
699
713
S : Into < String > ,
700
714
F : Fn ( ) + Send + Sync + ' static ,
701
715
{
702
- let mut registry = REGISTRY . registry . write ( ) . unwrap ( ) ;
716
+ let mut registry = REGISTRY
717
+ . get_or_init ( Default :: default)
718
+ . registry
719
+ . write ( )
720
+ . unwrap ( ) ;
703
721
let p = registry
704
722
. entry ( name. into ( ) )
705
723
. or_insert_with ( || Arc :: new ( FailPoint :: new ( ) ) ) ;
@@ -713,7 +731,11 @@ where
713
731
///
714
732
/// If the fail point doesn't exist, nothing will happen.
715
733
pub fn remove < S : AsRef < str > > ( name : S ) {
716
- let mut registry = REGISTRY . registry . write ( ) . unwrap ( ) ;
734
+ let mut registry = if let Some ( r) = REGISTRY . get ( ) {
735
+ r. registry . write ( ) . unwrap ( )
736
+ } else {
737
+ return ;
738
+ } ;
717
739
if let Some ( p) = registry. remove ( name. as_ref ( ) ) {
718
740
// wake up all pause failpoint.
719
741
p. set_actions ( "" , vec ! [ ] ) ;
@@ -937,7 +959,11 @@ mod async_imp {
937
959
S : Into < String > ,
938
960
F : Fn ( ) -> BoxFuture < ' static , ( ) > + Send + Sync + ' static ,
939
961
{
940
- let mut registry = REGISTRY . registry . write ( ) . unwrap ( ) ;
962
+ let mut registry = REGISTRY
963
+ . get_or_init ( Default :: default)
964
+ . registry
965
+ . write ( )
966
+ . unwrap ( ) ;
941
967
let p = registry
942
968
. entry ( name. into ( ) )
943
969
. or_insert_with ( || Arc :: new ( FailPoint :: new ( ) ) ) ;
@@ -949,8 +975,13 @@ mod async_imp {
949
975
950
976
#[ doc( hidden) ]
951
977
pub async fn async_eval < R , F : FnOnce ( Option < String > ) -> R > ( name : & str , f : F ) -> Option < R > {
978
+ let registry = if let Some ( r) = REGISTRY . get ( ) {
979
+ & r. registry
980
+ } else {
981
+ return None ;
982
+ } ;
952
983
let p = {
953
- let registry = REGISTRY . registry . read ( ) . unwrap ( ) ;
984
+ let registry = registry. read ( ) . unwrap ( ) ;
954
985
match registry. get ( name) {
955
986
None => return None ,
956
987
Some ( p) => p. clone ( ) ,
@@ -985,7 +1016,6 @@ mod async_imp {
985
1016
. next ( ) ;
986
1017
match task {
987
1018
Some ( Task :: Pause ) => {
988
- // let n = self.async_pause_notify.clone();
989
1019
self . async_pause_notify . notified ( ) . await ;
990
1020
return None ;
991
1021
}
@@ -1017,7 +1047,7 @@ mod async_imp {
1017
1047
} ,
1018
1048
Task :: Pause => unreachable ! ( ) ,
1019
1049
Task :: Yield => thread:: yield_now ( ) ,
1020
- Task :: Delay ( _ ) => {
1050
+ Task :: Delay ( t ) => {
1021
1051
let timer = Instant :: now ( ) ;
1022
1052
let timeout = Duration :: from_millis ( t) ;
1023
1053
while timer. elapsed ( ) < timeout { }
@@ -1251,21 +1281,19 @@ mod tests {
1251
1281
#[ cfg( feature = "async" ) ]
1252
1282
#[ cfg_attr( not( feature = "failpoints" ) , ignore) ]
1253
1283
#[ tokio:: test]
1254
- async fn test_async_failpoint ( ) {
1255
- use std:: time:: Duration ;
1256
-
1284
+ async fn test_async_failpoints ( ) {
1257
1285
let f1 = async {
1258
- async_fail_point ! ( "cb " ) ;
1286
+ async_fail_point ! ( "async_cb " ) ;
1259
1287
} ;
1260
1288
let f2 = async {
1261
- async_fail_point ! ( "cb " ) ;
1289
+ async_fail_point ! ( "async_cb " ) ;
1262
1290
} ;
1263
1291
1264
1292
let counter = Arc :: new ( AtomicUsize :: new ( 0 ) ) ;
1265
1293
let counter2 = counter. clone ( ) ;
1266
- cfg_async_callback ( "cb " , move || {
1294
+ cfg_async_callback ( "async_cb " , move || {
1267
1295
counter2. fetch_add ( 1 , Ordering :: SeqCst ) ;
1268
- Box :: pin ( async move {
1296
+ Box :: pin ( async {
1269
1297
tokio:: time:: sleep ( Duration :: from_millis ( 10 ) ) . await ;
1270
1298
} )
1271
1299
} )
@@ -1274,26 +1302,26 @@ mod tests {
1274
1302
f2. await ;
1275
1303
assert_eq ! ( 2 , counter. load( Ordering :: SeqCst ) ) ;
1276
1304
1277
- cfg ( "pause " , "pause" ) . unwrap ( ) ;
1305
+ cfg ( "async_pause " , "pause" ) . unwrap ( ) ;
1278
1306
let ( tx, mut rx) = tokio:: sync:: mpsc:: channel ( 1 ) ;
1279
1307
let handle = tokio:: spawn ( async move {
1280
- async_fail_point ! ( "pause " ) ;
1308
+ async_fail_point ! ( "async_pause " ) ;
1281
1309
tx. send ( ( ) ) . await . unwrap ( ) ;
1282
1310
} ) ;
1283
1311
tokio:: time:: timeout ( Duration :: from_millis ( 500 ) , rx. recv ( ) )
1284
1312
. await
1285
1313
. unwrap_err ( ) ;
1286
- remove ( "pause " ) ;
1314
+ remove ( "async_pause " ) ;
1287
1315
tokio:: time:: timeout ( Duration :: from_millis ( 500 ) , rx. recv ( ) )
1288
1316
. await
1289
1317
. unwrap ( ) ;
1290
1318
handle. await . unwrap ( ) ;
1291
1319
1292
- cfg ( "sleep " , "sleep(500)" ) . unwrap ( ) ;
1320
+ cfg ( "async_sleep " , "sleep(500)" ) . unwrap ( ) ;
1293
1321
let ( tx, mut rx) = tokio:: sync:: mpsc:: channel ( 1 ) ;
1294
1322
let handle = tokio:: spawn ( async move {
1295
1323
tx. send ( ( ) ) . await . unwrap ( ) ;
1296
- async_fail_point ! ( "sleep " ) ;
1324
+ async_fail_point ! ( "async_sleep " ) ;
1297
1325
tx. send ( ( ) ) . await . unwrap ( ) ;
1298
1326
} ) ;
1299
1327
rx. recv ( ) . await . unwrap ( ) ;
0 commit comments