@@ -125,6 +125,7 @@ pub(crate) struct RequestService<T: ConnectionModeProvider> {
125
125
connector_handle : HttpsConnectorWithSniHandle ,
126
126
client : hyper:: Client < HttpsConnectorWithSni , hyper:: Body > ,
127
127
connection_mode_provider : T ,
128
+ connection_mode_generation : usize ,
128
129
api_availability : ApiAvailabilityHandle ,
129
130
}
130
131
@@ -157,6 +158,7 @@ impl<T: ConnectionModeProvider + 'static> RequestService<T> {
157
158
connector_handle,
158
159
client,
159
160
connection_mode_provider,
161
+ connection_mode_generation : 0 ,
160
162
api_availability,
161
163
} ;
162
164
let handle = RequestServiceHandle { tx : command_tx } ;
@@ -193,8 +195,12 @@ impl<T: ConnectionModeProvider + 'static> RequestService<T> {
193
195
RequestCommand :: Reset => {
194
196
self . connector_handle . reset ( ) ;
195
197
}
196
- RequestCommand :: NextApiConfig => {
197
- self . connection_mode_provider . rotate ( ) . await ;
198
+ RequestCommand :: NextApiConfig ( generation) => {
199
+ if generation == self . connection_mode_generation {
200
+ self . connection_mode_generation =
201
+ self . connection_mode_generation . wrapping_add ( 1 ) ;
202
+ self . connection_mode_provider . rotate ( ) . await ;
203
+ }
198
204
}
199
205
}
200
206
}
@@ -209,6 +215,8 @@ impl<T: ConnectionModeProvider + 'static> RequestService<T> {
209
215
let api_availability = self . api_availability . clone ( ) ;
210
216
let request_future = request. into_future ( self . client . clone ( ) , api_availability. clone ( ) ) ;
211
217
218
+ let connection_mode_generation = self . connection_mode_generation ;
219
+
212
220
tokio:: spawn ( async move {
213
221
let response = request_future. await . map_err ( |error| error. map_aborted ( ) ) ;
214
222
@@ -217,7 +225,9 @@ impl<T: ConnectionModeProvider + 'static> RequestService<T> {
217
225
if err. is_network_error ( ) && !api_availability. get_state ( ) . is_offline ( ) {
218
226
log:: error!( "{}" , err. display_chain_with_msg( "HTTP request failed" ) ) ;
219
227
if let Some ( tx) = tx {
220
- let _ = tx. unbounded_send ( RequestCommand :: NextApiConfig ) ;
228
+ let _ = tx. unbounded_send ( RequestCommand :: NextApiConfig (
229
+ connection_mode_generation,
230
+ ) ) ;
221
231
}
222
232
}
223
233
}
@@ -256,7 +266,7 @@ pub(crate) enum RequestCommand {
256
266
oneshot:: Sender < std:: result:: Result < Response , Error > > ,
257
267
) ,
258
268
Reset ,
259
- NextApiConfig ,
269
+ NextApiConfig ( usize ) ,
260
270
}
261
271
262
272
/// A REST request that is sent to the RequestService to be executed.
0 commit comments