@@ -4,24 +4,29 @@ use scylla::client::session_builder::SessionBuilder;
4
4
use scylla:: statement:: prepared:: PreparedStatement ;
5
5
use std:: env;
6
6
use std:: sync:: Arc ;
7
+ use tokio:: sync:: Barrier ;
7
8
use uuid:: Uuid ;
8
9
9
10
const CONCURRENCY : usize = 2000 ;
11
+ const STEP : usize = 200000 ;
10
12
11
13
async fn insert_data (
12
14
session : Arc < Session > ,
13
15
start_index : usize ,
14
16
n : i32 ,
15
17
insert_query : & PreparedStatement ,
18
+ barrier : Arc < Barrier > ,
16
19
) -> Result < ( ) , Box < dyn std:: error:: Error > > {
17
20
let mut index = start_index;
18
21
19
22
while index < n as usize {
20
23
let id = Uuid :: new_v4 ( ) ;
21
24
session. execute_unpaged ( insert_query, ( id, 100 ) ) . await ?;
25
+ if index / STEP != ( index + CONCURRENCY ) / STEP {
26
+ barrier. wait ( ) . await ;
27
+ }
22
28
index += CONCURRENCY ;
23
29
}
24
-
25
30
Ok ( ( ) )
26
31
}
27
32
@@ -60,12 +65,14 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
60
65
61
66
let mut handles = vec ! [ ] ;
62
67
let session = Arc :: new ( session) ;
68
+ let barrier = Arc :: new ( Barrier :: new ( CONCURRENCY ) ) ;
63
69
64
70
for i in 0 ..CONCURRENCY {
65
71
let session_clone = Arc :: clone ( & session) ;
66
72
let insert_query_clone = insert_query. clone ( ) ;
73
+ let barrier_clone = barrier. clone ( ) ;
67
74
handles. push ( tokio:: spawn ( async move {
68
- insert_data ( session_clone, i, n, & insert_query_clone)
75
+ insert_data ( session_clone, i, n, & insert_query_clone, barrier_clone )
69
76
. await
70
77
. unwrap ( ) ;
71
78
} ) ) ;
0 commit comments