@@ -5,6 +5,7 @@ use crate::progress::{emit_gui_error, emit_gui_progress_update, is_running_with_
55use crate :: telemetry:: { send_log, LogLevel } ;
66use colored:: Colorize ;
77use rand:: prelude:: SliceRandom ;
8+ use rand:: Rng ;
89use reqwest:: blocking:: Client ;
910use reqwest:: blocking:: ClientBuilder ;
1011use 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