@@ -54,7 +54,7 @@ impl Client {
54
54
let notify2 = notify. clone ( ) ;
55
55
56
56
// Request sender
57
- tokio:: spawn ( async move {
57
+ let request_sender = tokio:: spawn ( async move {
58
58
let mut stream_id: u32 = 1 ;
59
59
60
60
while let Some ( ( body, resp_tx) ) = rx. recv ( ) . await {
@@ -93,14 +93,14 @@ impl Client {
93
93
// Response receiver
94
94
tokio:: spawn ( async move {
95
95
loop {
96
- let req_map = req_map. clone ( ) ;
97
96
tokio:: select! {
98
97
_ = notify2. notified( ) => {
99
98
break ;
100
99
}
101
100
res = receive( & mut reader) => {
102
101
match res {
103
102
Ok ( ( header, body) ) => {
103
+ let req_map = req_map. clone( ) ;
104
104
tokio:: spawn( async move {
105
105
let resp_tx2;
106
106
{
@@ -135,7 +135,23 @@ impl Client {
135
135
} ) ;
136
136
}
137
137
Err ( e) => {
138
- trace!( "error {:?}" , e) ;
138
+ debug!( "Connection closed by the ttRPC server: {}" , e) ;
139
+
140
+ // Abort the request sender task to prevent incoming RPC requests
141
+ // from being processed.
142
+ request_sender. abort( ) ;
143
+ let _ = request_sender. await ;
144
+
145
+ // Take all items out of `req_map`.
146
+ let mut map = std:: mem:: take( & mut * req_map. lock( ) . unwrap( ) ) ;
147
+ // Terminate outstanding RPC requests with the error.
148
+ for ( _stream_id, resp_tx) in map. drain( ) {
149
+ if let Err ( _e) = resp_tx. send( Err ( e. clone( ) ) ) . await {
150
+ warn!( "Failed to terminate pending RPC: \
151
+ the request has returned") ;
152
+ }
153
+ }
154
+
139
155
break ;
140
156
}
141
157
}
0 commit comments