@@ -7,8 +7,6 @@ use slog::error;
7
7
use std:: collections:: HashMap ;
8
8
use std:: net:: SocketAddr ;
9
9
use std:: str:: FromStr ;
10
- use std:: thread;
11
- use tokio:: runtime:: Runtime ;
12
10
use tokio:: time:: Duration ;
13
11
14
12
use raft_rs:: network:: { NetworkLayer , TCPManager } ;
@@ -17,15 +15,15 @@ use raft_rs::server::{Server, ServerConfig};
17
15
#[ tokio:: main]
18
16
async fn main ( ) {
19
17
// Define cluster configuration
20
- let mut cluster_nodes = vec ! [ 1 , 2 , 3 , 4 , 5 ] ;
18
+ let cluster_nodes = vec ! [ 1 , 2 , 3 , 4 , 5 ] ;
21
19
let peers = vec ! [
22
20
NodeMeta :: from( ( 1 , SocketAddr :: from_str( "127.0.0.1:5001" ) . unwrap( ) ) ) ,
23
21
NodeMeta :: from( ( 2 , SocketAddr :: from_str( "127.0.0.1:5002" ) . unwrap( ) ) ) ,
24
22
NodeMeta :: from( ( 3 , SocketAddr :: from_str( "127.0.0.1:5003" ) . unwrap( ) ) ) ,
25
23
NodeMeta :: from( ( 4 , SocketAddr :: from_str( "127.0.0.1:5004" ) . unwrap( ) ) ) ,
26
24
NodeMeta :: from( ( 5 , SocketAddr :: from_str( "127.0.0.1:5005" ) . unwrap( ) ) ) ,
27
25
] ;
28
- let mut cluster_config = ClusterConfig :: new ( peers. clone ( ) ) ;
26
+ let cluster_config = ClusterConfig :: new ( peers. clone ( ) ) ;
29
27
// Create server configs
30
28
let configs: Vec < _ > = peers
31
29
. clone ( )
@@ -44,10 +42,9 @@ async fn main() {
44
42
for ( i, config) in configs. into_iter ( ) . enumerate ( ) {
45
43
let id = cluster_nodes[ i] ;
46
44
let cc = cluster_config. clone ( ) ;
47
- handles. push ( thread:: spawn ( move || {
48
- let rt = Runtime :: new ( ) . unwrap ( ) ;
49
- let mut server = Server :: new ( id, config, cc) ;
50
- rt. block_on ( server. start ( ) ) ;
45
+ handles. push ( tokio:: spawn ( async move {
46
+ let mut server = Server :: new ( id, config, cc) . await ;
47
+ server. start ( ) . await ;
51
48
} ) ) ;
52
49
}
53
50
@@ -66,28 +63,25 @@ async fn main() {
66
63
} ;
67
64
68
65
// Launching a new node
69
- handles. push ( thread:: spawn ( move || {
70
- let rt = Runtime :: new ( ) . unwrap ( ) ;
71
- let mut server = Server :: new ( new_node_id, new_node_conf, cluster_config) ;
72
- rt. block_on ( server. start ( ) ) ;
66
+ handles. push ( tokio:: spawn ( async move {
67
+ let mut server = Server :: new ( new_node_id, new_node_conf, cluster_config) . await ;
68
+ server. start ( ) . await ;
73
69
} ) ) ;
74
70
75
71
// Simulate sending a Raft Join request after a few seconds
76
72
// Because we need to wait until the new node has started
77
73
tokio:: time:: sleep ( Duration :: from_secs ( 3 ) ) . await ;
78
74
add_node_request ( new_node_id, new_node_address) . await ;
79
75
80
- // Wait for all servers to finish
81
76
for handle in handles {
82
- handle. join ( ) . unwrap ( ) ;
77
+ handle. await . unwrap ( ) ;
83
78
}
84
79
}
85
80
86
81
async fn add_node_request ( new_node_id : u32 , addr : SocketAddr ) {
87
82
let log = get_logger ( ) ;
88
83
89
- let server_address = addr;
90
- let network_manager = TCPManager :: new ( server_address) ;
84
+ let network_manager = TCPManager :: new ( addr) ;
91
85
92
86
let request_data = vec ! [
93
87
new_node_id. to_be_bytes( ) . to_vec( ) ,
@@ -98,7 +92,13 @@ async fn add_node_request(new_node_id: u32, addr: SocketAddr) {
98
92
. concat ( ) ;
99
93
100
94
// Let's assume that 5001 is the port of the leader node.
101
- if let Err ( e) = network_manager. send ( & server_address, & request_data) . await {
95
+ if let Err ( e) = network_manager
96
+ . send (
97
+ & SocketAddr :: from_str ( "127.0.0.1:5001" ) . unwrap ( ) ,
98
+ & request_data,
99
+ )
100
+ . await
101
+ {
102
102
error ! ( log, "Failed to send client request: {}" , e) ;
103
103
}
104
104
}
0 commit comments