@@ -16,8 +16,6 @@ use std::collections::BTreeSet;
16
16
use std:: sync:: Arc ;
17
17
18
18
use async_raft:: config:: Config ;
19
- use async_raft:: raft:: ClientWriteRequest ;
20
- use async_raft:: ClientWriteError ;
21
19
use async_raft:: Raft ;
22
20
use async_raft:: RaftMetrics ;
23
21
use async_raft:: SnapshotPolicy ;
@@ -46,10 +44,10 @@ use common_tracing::tracing::Instrument;
46
44
use crate :: errors:: ConnectionError ;
47
45
use crate :: errors:: ForwardToLeader ;
48
46
use crate :: errors:: MetaError ;
49
- use crate :: errors:: RetryableError ;
50
47
use crate :: meta_service:: message:: AdminRequest ;
51
48
use crate :: meta_service:: message:: AdminResponse ;
52
49
use crate :: meta_service:: meta_leader:: MetaLeader ;
50
+ use crate :: meta_service:: AdminRequestInner ;
53
51
use crate :: meta_service:: MetaServiceImpl ;
54
52
use crate :: meta_service:: Network ;
55
53
use crate :: proto:: meta_service_client:: MetaServiceClient ;
@@ -532,31 +530,16 @@ impl MetaNode {
532
530
/// Submit a write request to the known leader. Returns the response after applying the request.
533
531
#[ tracing:: instrument( level = "info" , skip( self ) ) ]
534
532
pub async fn write ( & self , req : LogEntry ) -> common_exception:: Result < AppliedState > {
535
- let mut curr_leader = self . get_leader ( ) . await ;
536
- loop {
537
- let rst = if curr_leader == self . sto . id {
538
- self . write_to_local_leader ( req. clone ( ) ) . await ?
539
- } else {
540
- // forward to leader
541
-
542
- let addr = self . sto . get_node_addr ( & curr_leader) . await ?;
543
-
544
- // TODO: retry
545
- let mut client = MetaServiceClient :: connect ( format ! ( "http://{}" , addr) )
546
- . await
547
- . map_err ( |e| ErrorCode :: CannotConnectNode ( e. to_string ( ) ) ) ?;
548
- let resp = client. write ( req. clone ( ) ) . await ?;
549
- let rst: Result < AppliedState , RetryableError > = resp. into_inner ( ) . into ( ) ;
550
- rst
551
- } ;
552
-
553
- match rst {
554
- Ok ( resp) => return Ok ( resp) ,
555
- Err ( write_err) => match write_err {
556
- RetryableError :: ForwardToLeader { leader } => curr_leader = leader,
557
- } ,
558
- }
559
- }
533
+ let res = self
534
+ . handle_admin_req ( AdminRequest {
535
+ forward_to_leader : true ,
536
+ req : AdminRequestInner :: Write ( req. clone ( ) ) ,
537
+ } )
538
+ . await ?;
539
+
540
+ let res: AppliedState = res. try_into ( ) . expect ( "expect AppliedState" ) ;
541
+
542
+ Ok ( res)
560
543
}
561
544
562
545
/// Try to get the leader from the latest metrics of the local raft node.
@@ -616,34 +599,4 @@ impl MetaNode {
616
599
let res: Result < AdminResponse , MetaError > = raft_mes. into ( ) ;
617
600
res
618
601
}
619
-
620
- /// Write a meta log through local raft node.
621
- /// It works only when this node is the leader,
622
- /// otherwise it returns ClientWriteError::ForwardToLeader error indicating the latest leader.
623
- #[ tracing:: instrument( level = "info" , skip( self ) ) ]
624
- pub async fn write_to_local_leader (
625
- & self ,
626
- req : LogEntry ,
627
- ) -> common_exception:: Result < Result < AppliedState , RetryableError > > {
628
- let write_rst = self . raft . client_write ( ClientWriteRequest :: new ( req) ) . await ;
629
-
630
- tracing:: debug!( "raft.client_write rst: {:?}" , write_rst) ;
631
-
632
- match write_rst {
633
- Ok ( resp) => Ok ( Ok ( resp. data ) ) ,
634
- Err ( cli_write_err) => match cli_write_err {
635
- // fatal error
636
- ClientWriteError :: RaftError ( raft_err) => {
637
- Err ( ErrorCode :: MetaServiceError ( raft_err. to_string ( ) ) )
638
- }
639
- // retryable error
640
- ClientWriteError :: ForwardToLeader ( _, leader) => match leader {
641
- Some ( id) => Ok ( Err ( RetryableError :: ForwardToLeader { leader : id } ) ) ,
642
- None => Err ( ErrorCode :: MetaServiceUnavailable (
643
- "no leader to write" . to_string ( ) ,
644
- ) ) ,
645
- } ,
646
- } ,
647
- }
648
- }
649
602
}
0 commit comments