Skip to content

Commit 00d02df

Browse files
authored
Merge pull request #956 from louis-e/feat/overpass-arnis-priority
Refactor overpass endpoint selection order
2 parents a8ee09c + 6475210 commit 00d02df

1 file changed

Lines changed: 54 additions & 13 deletions

File tree

src/retrieve_data.rs

Lines changed: 54 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::progress::{emit_gui_error, emit_gui_progress_update, is_running_with_
55
use crate::telemetry::{send_log, LogLevel};
66
use colored::Colorize;
77
use rand::prelude::SliceRandom;
8+
use rand::Rng;
89
use reqwest::blocking::Client;
910
use reqwest::blocking::ClientBuilder;
1011
use serde::Deserialize;
@@ -121,6 +122,7 @@ pub fn fetch_data_from_overpass(
121122
emit_gui_progress_update(1.0, "Fetching data...");
122123

123124
// List of Overpass API servers
125+
let arnis_api_server = "https://api.arnismc.com/overpass/api/interpreter";
124126
let api_servers: Vec<&str> = vec![
125127
"https://overpass-api.de/api/interpreter",
126128
"https://lz4.overpass-api.de/api/interpreter",
@@ -181,19 +183,58 @@ pub fn fetch_data_from_overpass(
181183

182184
{
183185
// Fetch data from Overpass API.
184-
// Strategy: try each primary server once (shuffled), then each
185-
// fallback server once, with a short delay between attempts.
186-
let mut servers: Vec<&str> = api_servers.clone();
187-
servers.shuffle(&mut rand::rng());
188-
let mut fallbacks: Vec<&str> = fallback_api_servers.clone();
189-
fallbacks.shuffle(&mut rand::rng());
190-
servers.extend(fallbacks);
191-
192-
let total = servers.len();
186+
// Strategy:
187+
// 1) 25% chance: probe one random official server first.
188+
// 2) If the probe does not succeed, run the normal path: arnis API once,
189+
// then shuffled official, then shuffled fallback servers.
190+
#[derive(Clone, Copy, PartialEq, Eq)]
191+
enum ServerKind {
192+
Primary,
193+
Fallback,
194+
}
195+
196+
let mut rng = rand::rng();
197+
let mut request_plan: Vec<(&str, ServerKind)> = Vec::new();
198+
let mut probed_server: Option<&str> = None;
199+
200+
if rng.random_bool(0.25) {
201+
let probe_idx = rng.random_range(0..api_servers.len());
202+
let probe_server = api_servers[probe_idx];
203+
println!("Trying one official OSM server first (25% path): {probe_server}");
204+
request_plan.push((probe_server, ServerKind::Primary));
205+
probed_server = Some(probe_server);
206+
}
207+
208+
request_plan.push((arnis_api_server, ServerKind::Primary));
209+
210+
let mut shuffled_primary_servers = api_servers.clone();
211+
shuffled_primary_servers.shuffle(&mut rng);
212+
if let Some(probed_server) = probed_server {
213+
shuffled_primary_servers.retain(|&url| url != probed_server);
214+
}
215+
request_plan.extend(
216+
shuffled_primary_servers
217+
.into_iter()
218+
.map(|url| (url, ServerKind::Primary)),
219+
);
220+
221+
let mut shuffled_fallback_servers = fallback_api_servers.clone();
222+
shuffled_fallback_servers.shuffle(&mut rng);
223+
request_plan.extend(
224+
shuffled_fallback_servers
225+
.into_iter()
226+
.map(|url| (url, ServerKind::Fallback)),
227+
);
228+
229+
let first_fallback_index = request_plan
230+
.iter()
231+
.position(|(_, kind)| *kind == ServerKind::Fallback)
232+
.unwrap_or(request_plan.len());
233+
234+
let total = request_plan.len();
193235
let mut last_error: Option<Box<dyn std::error::Error>> = None;
194236
let response: String = 'server_loop: {
195-
for (i, server) in servers.iter().enumerate() {
196-
let url = server;
237+
for (i, (url, kind)) in request_plan.iter().enumerate() {
197238
let timeout_secs = if url.contains("private.coffee") {
198239
120
199240
} else {
@@ -216,10 +257,10 @@ pub fn fetch_data_from_overpass(
216257
last_error = Some(error);
217258

218259
if i + 1 < total {
219-
let delay_secs = if i < api_servers.len() { 3 } else { 5 };
260+
let delay_secs = if *kind == ServerKind::Fallback { 5 } else { 3 };
220261
println!("Retrying in {delay_secs}s (attempt {}/{total})...", i + 1);
221262
std::thread::sleep(Duration::from_secs(delay_secs));
222-
if i + 1 == api_servers.len() {
263+
if i + 1 == first_fallback_index {
223264
println!("Primary servers exhausted, trying fallback servers...");
224265
}
225266
}

0 commit comments

Comments
 (0)