diff options
| author | David Lönnhager <david.l@mullvad.net> | 2024-02-16 00:35:14 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2024-02-19 09:29:08 +0100 |
| commit | 6f19fea683c7bc1cdbe86afd80a2c672c6630601 (patch) | |
| tree | a80e1583138b521a687a39c76c0060c00b50106a /mullvad-api/src | |
| parent | 10b4df8f352d98e2e3a5507938fbaae4b78d08b6 (diff) | |
| download | mullvadvpn-6f19fea683c7bc1cdbe86afd80a2c672c6630601.tar.xz mullvadvpn-6f19fea683c7bc1cdbe86afd80a2c672c6630601.zip | |
Fix pointless API method rotations when concurrent requests fail
Diffstat (limited to 'mullvad-api/src')
| -rw-r--r-- | mullvad-api/src/rest.rs | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/mullvad-api/src/rest.rs b/mullvad-api/src/rest.rs index 158d84f01b..e4a1235177 100644 --- a/mullvad-api/src/rest.rs +++ b/mullvad-api/src/rest.rs @@ -125,6 +125,7 @@ pub(crate) struct RequestService<T: ConnectionModeProvider> { connector_handle: HttpsConnectorWithSniHandle, client: hyper::Client<HttpsConnectorWithSni, hyper::Body>, connection_mode_provider: T, + connection_mode_generation: usize, api_availability: ApiAvailabilityHandle, } @@ -157,6 +158,7 @@ impl<T: ConnectionModeProvider + 'static> RequestService<T> { connector_handle, client, connection_mode_provider, + connection_mode_generation: 0, api_availability, }; let handle = RequestServiceHandle { tx: command_tx }; @@ -193,8 +195,12 @@ impl<T: ConnectionModeProvider + 'static> RequestService<T> { RequestCommand::Reset => { self.connector_handle.reset(); } - RequestCommand::NextApiConfig => { - self.connection_mode_provider.rotate().await; + RequestCommand::NextApiConfig(generation) => { + if generation == self.connection_mode_generation { + self.connection_mode_generation = + self.connection_mode_generation.wrapping_add(1); + self.connection_mode_provider.rotate().await; + } } } } @@ -209,6 +215,8 @@ impl<T: ConnectionModeProvider + 'static> RequestService<T> { let api_availability = self.api_availability.clone(); let request_future = request.into_future(self.client.clone(), api_availability.clone()); + let connection_mode_generation = self.connection_mode_generation; + tokio::spawn(async move { let response = request_future.await.map_err(|error| error.map_aborted()); @@ -217,7 +225,9 @@ impl<T: ConnectionModeProvider + 'static> RequestService<T> { if err.is_network_error() && !api_availability.get_state().is_offline() { log::error!("{}", err.display_chain_with_msg("HTTP request failed")); if let Some(tx) = tx { - let _ = tx.unbounded_send(RequestCommand::NextApiConfig); + let _ = tx.unbounded_send(RequestCommand::NextApiConfig( + connection_mode_generation, + )); } } } @@ -256,7 +266,7 @@ pub(crate) enum RequestCommand { oneshot::Sender<std::result::Result<Response, Error>>, ), Reset, - NextApiConfig, + NextApiConfig(usize), } /// A REST request that is sent to the RequestService to be executed. |
