@@ -13,12 +13,15 @@ use clap::{Arg, ArgAction, ArgGroup, ArgMatches, Command, value_parser};
1313use tokio:: io:: { AsyncRead , AsyncReadExt } ;
1414use tokio:: net:: TcpStream ;
1515
16- use vey_io_ext:: LimitedReadExt ;
16+ use vey_io_ext:: { AsyncStream , LimitedReadExt , LimitedStream } ;
1717use vey_types:: collection:: { SelectiveVec , WeightedValue } ;
1818use vey_types:: net:: UpstreamAddr ;
1919
2020use super :: header:: { HeaderBuilder , KitexTTHeaderBuilder , ThriftTHeaderBuilder } ;
21- use super :: { MultiplexTransfer , SimplexTransfer , ThriftTcpResponse , ThriftTcpResponseError } ;
21+ use super :: {
22+ MultiplexTransfer , SimplexTransfer , ThriftRuntimeStats , ThriftTcpResponse ,
23+ ThriftTcpResponseError ,
24+ } ;
2225use crate :: module:: socket:: { AppendSocketArgs , SocketArgs } ;
2326use crate :: opts:: ProcArgs ;
2427use crate :: target:: thrift:: { AppendThriftArgs , ThriftGlobalArgs } ;
@@ -82,39 +85,49 @@ impl ThriftTcpArgs {
8285
8386 pub ( super ) async fn new_tcp_connection (
8487 & self ,
88+ stats : & Arc < ThriftRuntimeStats > ,
8589 proc_args : & ProcArgs ,
86- ) -> anyhow:: Result < TcpStream > {
90+ ) -> anyhow:: Result < ( LimitedStream < TcpStream > , SocketAddr ) > {
8791 let addrs = self
8892 . target_addrs
8993 . as_ref ( )
9094 . ok_or_else ( || anyhow ! ( "no target addr set" ) ) ?;
9195 let peer = * proc_args. select_peer ( addrs) ;
9296
93- self . socket . tcp_connect_to ( peer) . await
97+ let stream = self . socket . tcp_connect_to ( peer) . await ?;
98+ let local_addr = stream
99+ . local_addr ( )
100+ . map_err ( |e| anyhow ! ( "failed to get local address: {e:?}" ) ) ?;
101+
102+ let speed_limit = & proc_args. tcp_sock_speed_limit ;
103+ Ok ( (
104+ LimitedStream :: local_limited (
105+ stream,
106+ speed_limit. shift_millis ,
107+ speed_limit. max_south ,
108+ speed_limit. max_north ,
109+ Arc :: clone ( stats) ,
110+ ) ,
111+ local_addr,
112+ ) )
94113 }
95114
96115 pub ( super ) async fn new_multiplex_connection (
97116 self : & Arc < Self > ,
117+ stats : & Arc < ThriftRuntimeStats > ,
98118 proc_args : & ProcArgs ,
99119 ) -> anyhow:: Result < MultiplexTransfer > {
100- let tcp_stream = self . new_tcp_connection ( proc_args) . await ?;
101- let local_addr = tcp_stream
102- . local_addr ( )
103- . map_err ( |e| anyhow ! ( "failed to get local address: {e:?}" ) ) ?;
104-
120+ let ( tcp_stream, local_addr) = self . new_tcp_connection ( stats, proc_args) . await ?;
105121 let ( r, w) = tcp_stream. into_split ( ) ;
106122 MultiplexTransfer :: start ( self . clone ( ) , r, w, local_addr, self . timeout )
107123 }
108124
109125 pub ( super ) async fn new_simplex_connection (
110126 self : & Arc < Self > ,
127+ stats : & Arc < ThriftRuntimeStats > ,
111128 proc_args : & ProcArgs ,
112129 ) -> anyhow:: Result < SimplexTransfer > {
113- let tcp_stream = self . new_tcp_connection ( proc_args) . await ?;
114- let local_addr = tcp_stream
115- . local_addr ( )
116- . map_err ( |e| anyhow ! ( "failed to get local address: {e:?}" ) ) ?;
117-
130+ let ( tcp_stream, local_addr) = self . new_tcp_connection ( stats, proc_args) . await ?;
118131 let ( r, w) = tcp_stream. into_split ( ) ;
119132 SimplexTransfer :: new ( self . clone ( ) , r, w, local_addr)
120133 }
0 commit comments