@@ -23,8 +23,14 @@ use memstore::ClientResponse as MemClientResponse;
23
23
use memstore:: MemStore ;
24
24
use openraft:: async_trait:: async_trait;
25
25
use openraft:: error:: AddLearnerError ;
26
+ use openraft:: error:: AppendEntriesError ;
26
27
use openraft:: error:: ClientReadError ;
27
28
use openraft:: error:: ClientWriteError ;
29
+ use openraft:: error:: InstallSnapshotError ;
30
+ use openraft:: error:: NetworkError ;
31
+ use openraft:: error:: RPCError ;
32
+ use openraft:: error:: RemoteError ;
33
+ use openraft:: error:: VoteError ;
28
34
use openraft:: metrics:: Wait ;
29
35
use openraft:: raft:: AddLearnerResponse ;
30
36
use openraft:: raft:: AppendEntriesRequest ;
@@ -805,6 +811,18 @@ impl RaftRouter {
805
811
806
812
Ok ( ( ) )
807
813
}
814
+
815
+ pub async fn check_reachable ( & self , id : NodeId , target : NodeId ) -> std:: result:: Result < ( ) , NetworkError > {
816
+ let isolated = self . isolated_nodes . read ( ) . await ;
817
+
818
+ if isolated. contains ( & target) || isolated. contains ( & id) {
819
+ let err = anyhow ! ( "target node is isolated" ) ;
820
+ let network_err = NetworkError :: from ( err) ;
821
+ return Err ( network_err) ;
822
+ }
823
+
824
+ Ok ( ( ) )
825
+ }
808
826
}
809
827
810
828
#[ async_trait]
@@ -814,46 +832,52 @@ impl RaftNetwork<MemClientRequest> for RaftRouter {
814
832
& self ,
815
833
target : u64 ,
816
834
rpc : AppendEntriesRequest < MemClientRequest > ,
817
- ) -> Result < AppendEntriesResponse > {
835
+ ) -> std :: result :: Result < AppendEntriesResponse , RPCError < AppendEntriesError > > {
818
836
tracing:: debug!( "append_entries to id={} {:?}" , target, rpc) ;
819
837
self . rand_send_delay ( ) . await ;
820
838
839
+ self . check_reachable ( rpc. leader_id , target) . await ?;
840
+
821
841
let rt = self . routing_table . read ( ) . await ;
822
- let isolated = self . isolated_nodes . read ( ) . await ;
823
842
let addr = rt. get ( & target) . expect ( "target node not found in routing table" ) ;
824
- if isolated. contains ( & target) || isolated. contains ( & rpc. leader_id ) {
825
- return Err ( anyhow ! ( "target node is isolated" ) ) ;
826
- }
843
+
827
844
let resp = addr. 0 . append_entries ( rpc) . await ;
828
845
829
846
tracing:: debug!( "append_entries: recv resp from id={} {:?}" , target, resp) ;
830
- Ok ( resp?)
847
+ let resp = resp. map_err ( |e| RemoteError :: new ( target, e) ) ?;
848
+ Ok ( resp)
831
849
}
832
850
833
851
/// Send an InstallSnapshot RPC to the target Raft node (§7).
834
- async fn send_install_snapshot ( & self , target : u64 , rpc : InstallSnapshotRequest ) -> Result < InstallSnapshotResponse > {
852
+ async fn send_install_snapshot (
853
+ & self ,
854
+ target : u64 ,
855
+ rpc : InstallSnapshotRequest ,
856
+ ) -> std:: result:: Result < InstallSnapshotResponse , RPCError < InstallSnapshotError > > {
835
857
self . rand_send_delay ( ) . await ;
836
858
859
+ self . check_reachable ( rpc. leader_id , target) . await ?;
860
+
837
861
let rt = self . routing_table . read ( ) . await ;
838
- let isolated = self . isolated_nodes . read ( ) . await ;
839
862
let addr = rt. get ( & target) . expect ( "target node not found in routing table" ) ;
840
- if isolated . contains ( & target ) || isolated . contains ( & rpc . leader_id ) {
841
- return Err ( anyhow ! ( "target node is isolated" ) ) ;
842
- }
843
- Ok ( addr . 0 . install_snapshot ( rpc ) . await ? )
863
+
864
+ let resp = addr . 0 . install_snapshot ( rpc ) . await ;
865
+ let resp = resp . map_err ( |e| RemoteError :: new ( target , e ) ) ? ;
866
+ Ok ( resp )
844
867
}
845
868
846
869
/// Send a RequestVote RPC to the target Raft node (§5).
847
- async fn send_vote ( & self , target : u64 , rpc : VoteRequest ) -> Result < VoteResponse > {
870
+ async fn send_vote ( & self , target : u64 , rpc : VoteRequest ) -> std :: result :: Result < VoteResponse , RPCError < VoteError > > {
848
871
self . rand_send_delay ( ) . await ;
849
872
873
+ self . check_reachable ( rpc. candidate_id , target) . await ?;
874
+
850
875
let rt = self . routing_table . read ( ) . await ;
851
- let isolated = self . isolated_nodes . read ( ) . await ;
852
876
let addr = rt. get ( & target) . expect ( "target node not found in routing table" ) ;
853
- if isolated . contains ( & target ) || isolated . contains ( & rpc . candidate_id ) {
854
- return Err ( anyhow ! ( "target node is isolated" ) ) ;
855
- }
856
- Ok ( addr . 0 . vote ( rpc ) . await ? )
877
+
878
+ let resp = addr . 0 . vote ( rpc ) . await ;
879
+ let resp = resp . map_err ( |e| RemoteError :: new ( target , e ) ) ? ;
880
+ Ok ( resp )
857
881
}
858
882
}
859
883
0 commit comments