@@ -14,7 +14,8 @@ use ic_agent::agent::http_transport::{
14
14
route_provider:: { RoundRobinRouteProvider , RouteProvider } ,
15
15
} ;
16
16
use reqwest:: Client ;
17
- use tokio:: { runtime:: Handle , sync:: oneshot, time:: sleep} ;
17
+ use tokio:: { runtime:: Handle , sync:: oneshot} ;
18
+ use tokio_util:: sync:: CancellationToken ;
18
19
19
20
// To run the benchmark use the command:
20
21
// $ cargo bench --bench perf_route_provider --features bench
@@ -39,7 +40,9 @@ fn benchmark_route_providers(c: &mut Criterion) {
39
40
. expect ( "failed to create runtime" ) ;
40
41
41
42
// Setup all route providers
42
- let route_providers = setup_route_providers ( nodes_count, runtime. handle ( ) . clone ( ) ) ;
43
+ let token = CancellationToken :: new ( ) ;
44
+ let route_providers =
45
+ setup_route_providers ( nodes_count, runtime. handle ( ) . clone ( ) , token. clone ( ) ) ;
43
46
44
47
for ( name, instance) in route_providers {
45
48
group. bench_function ( name, |b| {
@@ -48,6 +51,7 @@ fn benchmark_route_providers(c: &mut Criterion) {
48
51
} )
49
52
} ) ;
50
53
}
54
+ token. cancel ( ) ;
51
55
group. finish ( ) ;
52
56
}
53
57
@@ -96,6 +100,7 @@ async fn setup_dynamic_route_provider<S: RoutingSnapshot + 'static>(
96
100
fn setup_route_providers (
97
101
nodes_count : usize ,
98
102
runtime : Handle ,
103
+ cancellation_token : CancellationToken ,
99
104
) -> Vec < ( String , Arc < dyn RouteProvider > ) > {
100
105
// Assemble all instances for benching.
101
106
let mut route_providers = vec ! [ ] ;
@@ -106,10 +111,11 @@ fn setup_route_providers(
106
111
) ) ;
107
112
// Setup dynamic round-robin route provider
108
113
let ( tx, rx) = oneshot:: channel ( ) ;
114
+ let token_cloned = cancellation_token. clone ( ) ;
109
115
runtime. spawn ( async move {
110
116
let rp = setup_dynamic_route_provider ( nodes_count, RoundRobinRoutingSnapshot :: new ( ) ) . await ;
111
117
tx. send ( rp) . unwrap ( ) ;
112
- sleep ( Duration :: from_secs ( 100000 ) ) . await ;
118
+ token_cloned . cancelled ( ) . await ;
113
119
} ) ;
114
120
let route_provider = runtime. block_on ( async { rx. await . unwrap ( ) } ) ;
115
121
route_providers. push ( (
@@ -118,10 +124,11 @@ fn setup_route_providers(
118
124
) ) ;
119
125
// Setup dynamic latency-based route provider
120
126
let ( tx, rx) = oneshot:: channel ( ) ;
127
+ let token_cloned = cancellation_token. clone ( ) ;
121
128
runtime. spawn ( async move {
122
129
let rp = setup_dynamic_route_provider ( nodes_count, LatencyRoutingSnapshot :: new ( ) ) . await ;
123
130
tx. send ( rp) . unwrap ( ) ;
124
- sleep ( Duration :: from_secs ( 100000 ) ) . await ;
131
+ token_cloned . cancelled ( ) . await ;
125
132
} ) ;
126
133
let route_provider = runtime. block_on ( async { rx. await . unwrap ( ) } ) ;
127
134
route_providers. push ( (
0 commit comments