@@ -21,7 +21,7 @@ use duva::prelude::{Topology, anyhow};
2121use duva:: presentation:: clients:: request:: { ClientAction , NonMutatingAction , ServerResponse } ;
2222use futures:: future:: try_join_all;
2323
24- use duva:: prelude:: anyhow:: anyhow ;
24+ use duva:: prelude:: anyhow:: bail ;
2525use node_connections:: NodeConnection ;
2626use read_stream:: ServerStreamReader ;
2727use tracing:: error;
@@ -37,8 +37,10 @@ pub struct Broker {
3737
3838impl Broker {
3939 pub ( crate ) async fn new ( server_addr : & PeerIdentifier ) -> anyhow:: Result < Self > {
40- let ( r, w, auth_response) = Broker :: authenticate ( & server_addr. clone ( ) , None ) . await ?;
40+ let stream =
41+ TcpStream :: connect ( server_addr. as_str ( ) ) . await . map_err ( |_| IoError :: NotConnected ) ?;
4142
43+ let ( r, w, auth_response) = Broker :: authenticate ( stream, Default :: default ( ) ) . await ?;
4244 let ( broker_tx, rx) = tokio:: sync:: mpsc:: channel :: < BrokerMessage > ( 2000 ) ;
4345
4446 let seed_replid = auth_response. replication_id ;
@@ -109,21 +111,17 @@ impl Broker {
109111 }
110112
111113 pub ( crate ) async fn authenticate (
112- server_addr : & PeerIdentifier ,
113- auth_request : Option < ConnectionRequest > ,
114- ) -> Result < ( ServerStreamReader , ServerStreamWriter , ConnectionResponse ) , IoError > {
115- let mut stream =
116- TcpStream :: connect ( server_addr. as_str ( ) ) . await . map_err ( |_| IoError :: NotConnected ) ?;
117- let request = auth_request. unwrap_or_default ( ) ;
118- let connection_req = ConnectionRequests :: Authenticate ( request) ;
119- stream. serialized_write ( connection_req) . await ?; // client_id not exist
120- let connection_res: ConnectionResponses = stream. deserialized_read ( ) . await ?;
121- let auth_response = match connection_res {
122- ConnectionResponses :: Authenticated ( response) => response,
123- _ => return Err ( IoError :: Custom ( "Authentication failed" . into ( ) ) ) ,
114+ mut stream : TcpStream ,
115+ conn_req : ConnectionRequest ,
116+ ) -> anyhow:: Result < ( ServerStreamReader , ServerStreamWriter , ConnectionResponse ) > {
117+ stream. serialized_write ( ConnectionRequests :: Authenticate ( conn_req) ) . await ?; // client_id not exist
118+
119+ let ConnectionResponses :: Authenticated ( response) = stream. deserialized_read ( ) . await ? else {
120+ bail ! ( "Authentication failed" ) ;
124121 } ;
122+
125123 let ( r, w) = stream. into_split ( ) ;
126- Ok ( ( ServerStreamReader ( r) , ServerStreamWriter ( w) , auth_response ) )
124+ Ok ( ( ServerStreamReader ( r) , ServerStreamWriter ( w) , response ) )
127125 }
128126
129127 // pull-based leader discovery
@@ -161,12 +159,12 @@ impl Broker {
161159 }
162160
163161 async fn discover_leader_from ( & mut self , follower : PeerIdentifier ) -> anyhow:: Result < ( ) > {
164- let mut stream =
165- TcpStream :: connect ( follower. as_str ( ) ) . await . map_err ( |_| IoError :: NotConnected ) ?;
162+ let mut stream = TcpStream :: connect ( follower. as_str ( ) ) . await ?;
166163 stream. serialized_write ( ConnectionRequests :: Discovery ) . await ?;
167164 let ConnectionResponses :: Discovery { leader_id } = stream. deserialized_read ( ) . await ? else {
168- return Err ( anyhow ! ( "Discovery failed" ) ) ;
165+ bail ! ( "Discovery failed!" ) ;
169166 } ;
167+
170168 self . add_node_connection ( leader_id. clone ( ) ) . await
171169 }
172170
@@ -190,14 +188,14 @@ impl Broker {
190188 let auth_req =
191189 ConnectionRequest { client_id : Some ( self . client_id . to_string ( ) ) , request_id : 0 } ;
192190
193- let Ok ( ( server_stream_reader , server_stream_writer , auth_response ) ) =
194- Self :: authenticate ( & peer_id, Some ( auth_req ) ) . await
195- else {
196- return Err ( anyhow :: anyhow! ( "Authentication failed!" ) ) ;
197- } ;
191+ let stream =
192+ TcpStream :: connect ( peer_id. as_str ( ) ) . await . map_err ( |_| IoError :: NotConnected ) ? ;
193+
194+ let ( server_stream_reader , server_stream_writer , auth_response ) =
195+ Self :: authenticate ( stream , auth_req ) . await ? ;
198196
199197 if !auth_response. is_leader_node {
200- return Err ( anyhow :: anyhow !( "Only Leader connection is allowed!" ) ) ;
198+ bail ! ( "Only Leader connection is allowed!" ) ;
201199 }
202200
203201 self . node_connections . insert (
0 commit comments