@@ -20,13 +20,18 @@ pub enum RetryableReqwestError {
2020 RetryableError ( CasClientError ) ,
2121}
2222
23+ struct ConnectionPermitInfo {
24+ permit : Option < ConnectionPermit > ,
25+ transfer_size_if_known : Option < u64 > ,
26+ }
27+
2328pub struct RetryWrapper {
2429 max_attempts : usize ,
2530 base_delay_ms : u64 ,
2631 no_retry_on_429 : bool ,
2732 log_errors_as_info : bool ,
2833 api_tag : & ' static str ,
29- connection_permit : Option < Mutex < Option < ( ConnectionPermit , Option < u64 > ) > > > ,
34+ connection_permit : Option < Mutex < ConnectionPermitInfo > > ,
3035}
3136
3237impl RetryWrapper {
@@ -61,8 +66,11 @@ impl RetryWrapper {
6166 self
6267 }
6368
64- pub fn with_connection_permit ( mut self , permit : ConnectionPermit , n_bytes : Option < u64 > ) -> Self {
65- self . connection_permit = Some ( Mutex :: new ( Some ( ( permit, n_bytes) ) ) ) ;
69+ pub fn with_connection_permit ( mut self , permit : ConnectionPermit , transfer_size_if_known : Option < u64 > ) -> Self {
70+ self . connection_permit = Some ( Mutex :: new ( ConnectionPermitInfo {
71+ permit : Some ( permit) ,
72+ transfer_size_if_known,
73+ } ) ) ;
6674 self
6775 }
6876
@@ -205,8 +213,8 @@ impl RetryWrapper {
205213 let ( make_request, process_fn, try_count, self_) = retry_info. as_ref ( ) ;
206214
207215 if let Some ( p) = & self_. connection_permit {
208- if let Some ( p) = p. lock ( ) . await . as_mut ( ) {
209- p. 0 . transfer_starting ( )
216+ if let Some ( p) = p. lock ( ) . await . permit . as_mut ( ) {
217+ p. transfer_starting ( )
210218 }
211219 }
212220
@@ -227,21 +235,26 @@ impl RetryWrapper {
227235
228236 // Now, possibly adjust the connection permit.
229237 if let Some ( permit_holder) = & self_. connection_permit {
230- let mut maybe_permit = permit_holder. lock ( ) . await ;
238+ let mut permit_info = permit_holder. lock ( ) . await ;
231239
232240 match & processing_result {
233241 Ok ( _) => {
234- if let Some ( ( permit, maybe_size) ) = maybe_permit. take ( ) {
235- permit. report_completion ( maybe_size. unwrap_or ( reply_bytes) , true ) . await ;
242+ if let Some ( permit) = permit_info. permit . take ( ) {
243+ permit
244+ . report_completion (
245+ permit_info. transfer_size_if_known . unwrap_or ( reply_bytes) ,
246+ true ,
247+ )
248+ . await ;
236249 }
237250 } ,
238251 Err ( RetryableReqwestError :: FatalError ( _) ) => {
239- if let Some ( ( permit, _ ) ) = maybe_permit . take ( ) {
252+ if let Some ( permit) = permit_info . permit . take ( ) {
240253 permit. report_completion ( 0 , false ) . await ;
241254 }
242255 } ,
243256 Err ( RetryableReqwestError :: RetryableError ( _) ) => {
244- if let Some ( ( permit, _ ) ) = maybe_permit . as_ref ( ) {
257+ if let Some ( permit) = permit_info . permit . as_ref ( ) {
245258 permit. report_retryable_failure ( ) . await ;
246259 }
247260 } ,
0 commit comments