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, diff --git a/src/lib.rs b/src/lib.rs index 6e8c8d8..fe525c1 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"); @@ -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!");