Skip to content

Commit 6d5d592

Browse files
committed
Merge branch 'fix-concurrent-access-rotations' into main
2 parents 10b4df8 + 6f19fea commit 6d5d592

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

mullvad-api/src/rest.rs

+14-4
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ pub(crate) struct RequestService<T: ConnectionModeProvider> {
125125
connector_handle: HttpsConnectorWithSniHandle,
126126
client: hyper::Client<HttpsConnectorWithSni, hyper::Body>,
127127
connection_mode_provider: T,
128+
connection_mode_generation: usize,
128129
api_availability: ApiAvailabilityHandle,
129130
}
130131

@@ -157,6 +158,7 @@ impl<T: ConnectionModeProvider + 'static> RequestService<T> {
157158
connector_handle,
158159
client,
159160
connection_mode_provider,
161+
connection_mode_generation: 0,
160162
api_availability,
161163
};
162164
let handle = RequestServiceHandle { tx: command_tx };
@@ -193,8 +195,12 @@ impl<T: ConnectionModeProvider + 'static> RequestService<T> {
193195
RequestCommand::Reset => {
194196
self.connector_handle.reset();
195197
}
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+
}
198204
}
199205
}
200206
}
@@ -209,6 +215,8 @@ impl<T: ConnectionModeProvider + 'static> RequestService<T> {
209215
let api_availability = self.api_availability.clone();
210216
let request_future = request.into_future(self.client.clone(), api_availability.clone());
211217

218+
let connection_mode_generation = self.connection_mode_generation;
219+
212220
tokio::spawn(async move {
213221
let response = request_future.await.map_err(|error| error.map_aborted());
214222

@@ -217,7 +225,9 @@ impl<T: ConnectionModeProvider + 'static> RequestService<T> {
217225
if err.is_network_error() && !api_availability.get_state().is_offline() {
218226
log::error!("{}", err.display_chain_with_msg("HTTP request failed"));
219227
if let Some(tx) = tx {
220-
let _ = tx.unbounded_send(RequestCommand::NextApiConfig);
228+
let _ = tx.unbounded_send(RequestCommand::NextApiConfig(
229+
connection_mode_generation,
230+
));
221231
}
222232
}
223233
}
@@ -256,7 +266,7 @@ pub(crate) enum RequestCommand {
256266
oneshot::Sender<std::result::Result<Response, Error>>,
257267
),
258268
Reset,
259-
NextApiConfig,
269+
NextApiConfig(usize),
260270
}
261271

262272
/// A REST request that is sent to the RequestService to be executed.

0 commit comments

Comments
 (0)