From 54faf88124617a28c9fdebdb3f78f2c029bc6878 Mon Sep 17 00:00:00 2001 From: vincent Date: Tue, 4 Mar 2025 15:29:16 -0500 Subject: [PATCH 1/3] Update route stability and sequencing preferences for low latency --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 6e8c8d8..073d0af 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -294,8 +294,8 @@ mod tests { let (route_id, route_id_blob) = veilid_api .new_custom_private_route( &VALID_CRYPTO_KINDS, - veilid_core::Stability::Reliable, - veilid_core::Sequencing::PreferOrdered, + veilid_core::Stability::LowLatency, + veilid_core::Sequencing::NoPreference, ) .await .expect("Failed to create route"); From eb13072fbf8725b32106877db4971acf968f2ca0 Mon Sep 17 00:00:00 2001 From: vincent Date: Tue, 4 Mar 2025 15:57:44 -0500 Subject: [PATCH 2/3] Increase retry limit for downloading hash from peers test --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 073d0af..fe525c1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -882,7 +882,7 @@ mod tests { sleep(Duration::from_secs(2)).await; // Download hash from peers - let mut retries = 5; + let mut retries = 10; while retries > 0 { if group2.download_hash_from_peers(&file_hash).await.is_ok() { println!("Download success!"); From d527c54528bf482a82fd0d232f78b577aa8ba365 Mon Sep 17 00:00:00 2001 From: vincent Date: Tue, 4 Mar 2025 16:38:36 -0500 Subject: [PATCH 3/3] Implement retry mechanism with exponential backoff for DHT record retrieval --- src/group.rs | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/group.rs b/src/group.rs index 4a2914f..a980e1b 100644 --- a/src/group.rs +++ b/src/group.rs @@ -280,11 +280,41 @@ impl Group { let keypair = None; let veilid = self.get_veilid_api(); + let mut dht_record: Option = None; + let mut retries = 6; - let dht_record = self - .routing_context - .open_dht_record(repo_id.clone(), keypair) - .await?; + while retries > 0 { + retries -= 1; + let dht_record_result = self + .routing_context + .open_dht_record(repo_id.clone(), keypair.clone()) + .await; + + match dht_record_result { + Ok(record) => { + dht_record = Some(record); + break; + } + Err(e) => { + eprintln!( + "Failed to open DHT record: {}. Retries left: {}", + e, retries + ); + if retries == 0 { + return Err(anyhow!( + "Unable to open DHT record, reached max retries: {}", + e + )); + } + } + } + + // Add a delay before retrying (wit exponential backoff) + tokio::time::sleep(std::time::Duration::from_millis(100 * (7 - retries) as u64)).await; + } + + // Ensure that `dht_record` is set before proceeding + let dht_record = dht_record.ok_or_else(|| anyhow!("DHT record retrieval failed"))?; let repo = Repo { dht_record,