From 800da8768ead80ab331cd824b70e194f6bda2d7f Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Mon, 18 Nov 2024 15:15:03 +0700 Subject: [PATCH 1/3] retry when appropriate --- .../query_dpns_contested_resources.rs | 57 +++++++++++++------ src/ui/dpns_contested_names_screen.rs | 4 +- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/src/backend_task/contested_names/query_dpns_contested_resources.rs b/src/backend_task/contested_names/query_dpns_contested_resources.rs index 4e7147879..acb38fc24 100644 --- a/src/backend_task/contested_names/query_dpns_contested_resources.rs +++ b/src/backend_task/contested_names/query_dpns_contested_resources.rs @@ -9,6 +9,7 @@ use dash_sdk::platform::FetchMany; use dash_sdk::query_types::ContestedResource; use dash_sdk::Sdk; use std::sync::Arc; +use std::time::Instant; use tokio::sync::{mpsc, OwnedSemaphorePermit, Semaphore}; impl AppContext { @@ -24,22 +25,28 @@ impl AppContext { let Some(contested_index) = document_type.find_contested_index() else { return Err("No contested index on dpns domains".to_string()); }; + const MAX_RETRIES: usize = 3; let mut start_at_value = None; loop { let query = VotePollsByDocumentTypeQuery { contract_id: data_contract.id(), document_type_name: document_type.name().to_string(), index_name: contested_index.name.clone(), - start_at_value, + start_at_value: start_at_value.clone(), start_index_values: vec!["dash".into()], // hardcoded for dpns end_index_values: vec![], limit: Some(100), order_ascending: true, }; - let (contested_resources) = ContestedResource::fetch_many(&sdk, query.clone()) - .await - .map_err(|e| { + // Initialize retry counter and start time + let mut retries = 0; + let start_time = Instant::now(); + + let contested_resources = match ContestedResource::fetch_many(&sdk, query.clone()).await + { + Ok(contested_resources) => contested_resources, + Err(e) => { tracing::error!("Error fetching contested resources: {}", e); if let dash_sdk::Error::Proof( dash_sdk::ProofVerifierError::GroveDBProofVerificationError { @@ -55,22 +62,22 @@ impl AppContext { let encoded_query = match bincode::encode_to_vec(&query, bincode::config::standard()) .map_err(|encode_err| { - tracing::error!("error encoding query: {}", encode_err); - format!("error encoding query: {}", encode_err) + tracing::error!("Error encoding query: {}", encode_err); + format!("Error encoding query: {}", encode_err) }) { Ok(encoded_query) => encoded_query, - Err(e) => return e, + Err(e) => return Err(e), }; // Encode the path_query using bincode let verification_path_query_bytes = match bincode::encode_to_vec(&path_query, bincode::config::standard()) .map_err(|encode_err| { - tracing::error!("error encoding path_query: {}", encode_err); - format!("error encoding path_query: {}", encode_err) + tracing::error!("Error encoding path_query: {}", encode_err); + format!("Error encoding path_query: {}", encode_err) }) { Ok(encoded_path_query) => encoded_path_query, - Err(e) => return e, + Err(e) => return Err(e), }; if let Err(e) = self @@ -86,12 +93,30 @@ impl AppContext { }) .map_err(|e| e.to_string()) { - return e; + return Err(e); } } - format!("Error fetching contested resources: {}", e) - })?; - + if e.to_string().contains("try another server") { + retries += 1; + if retries > MAX_RETRIES { + tracing::error!( + "Max retries reached for query after {:?}: {}", + start_time.elapsed(), + e + ); + return Err(format!( + "Error fetching contested resources after retries: {}", + e + )); + } else { + // Retry + continue; + } + } else { + return Err(format!("Error fetching contested resources: {}", e)); + } + } + }; let contested_resources_len = contested_resources.0.len(); if contested_resources_len == 0 { @@ -146,7 +171,7 @@ impl AppContext { .expect("expected to send refresh"); } Err(e) => { - tracing::error!("error querying dpns end times: {}", e); + tracing::error!("Error querying dpns end times: {}", e); sender .send(TaskResult::Error(e)) .await @@ -184,7 +209,7 @@ impl AppContext { } Err(e) => { tracing::error!( - "error querying dpns vote contenders for {}: {}", + "Error querying dpns vote contenders for {}: {}", name, e ); diff --git a/src/ui/dpns_contested_names_screen.rs b/src/ui/dpns_contested_names_screen.rs index 07a84438d..dd8ce1c9f 100644 --- a/src/ui/dpns_contested_names_screen.rs +++ b/src/ui/dpns_contested_names_screen.rs @@ -786,7 +786,9 @@ impl ScreenLike for DPNSContestedNamesScreen { } fn display_message(&mut self, message: &str, message_type: MessageType) { - self.error_message = Some((message.to_string(), message_type, Utc::now())); + if !message.contains("try another server") { + self.error_message = Some((message.to_string(), message_type, Utc::now())); + } } fn ui(&mut self, ctx: &Context) -> AppAction { From 6c8f34c0c5ecfcbe2a003e1bff3de87fa93ccb26 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Mon, 18 Nov 2024 15:54:33 +0700 Subject: [PATCH 2/3] retry both errors in both places. works on testnet --- .../query_dpns_contested_resources.rs | 15 +++--- .../query_dpns_vote_contenders.rs | 50 +++++++++++++++---- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/src/backend_task/contested_names/query_dpns_contested_resources.rs b/src/backend_task/contested_names/query_dpns_contested_resources.rs index acb38fc24..db8b335fa 100644 --- a/src/backend_task/contested_names/query_dpns_contested_resources.rs +++ b/src/backend_task/contested_names/query_dpns_contested_resources.rs @@ -39,9 +39,8 @@ impl AppContext { order_ascending: true, }; - // Initialize retry counter and start time + // Initialize retry counter let mut retries = 0; - let start_time = Instant::now(); let contested_resources = match ContestedResource::fetch_many(&sdk, query.clone()).await { @@ -96,14 +95,14 @@ impl AppContext { return Err(e); } } - if e.to_string().contains("try another server") { + if e.to_string().contains("try another server") + || e.to_string().contains( + "contract not found when querying from value with contract info", + ) + { retries += 1; if retries > MAX_RETRIES { - tracing::error!( - "Max retries reached for query after {:?}: {}", - start_time.elapsed(), - e - ); + tracing::error!("Max retries reached for query: {}", e); return Err(format!( "Error fetching contested resources after retries: {}", e diff --git a/src/backend_task/contested_names/query_dpns_vote_contenders.rs b/src/backend_task/contested_names/query_dpns_vote_contenders.rs index 21f194274..162b7147b 100644 --- a/src/backend_task/contested_names/query_dpns_vote_contenders.rs +++ b/src/backend_task/contested_names/query_dpns_vote_contenders.rs @@ -44,15 +44,47 @@ impl AppContext { result_type: ContestedDocumentVotePollDriveQueryResultType::DocumentsAndVoteTally, }; - let contenders = - ContenderWithSerializedDocument::fetch_many(&sdk, contenders_query.clone()) - .await - .map_err(|e| { + // Define retries + const MAX_RETRIES: usize = 3; + let mut retries = 0; + + loop { + match ContenderWithSerializedDocument::fetch_many(&sdk, contenders_query.clone()).await + { + Ok(contenders) => { + // If successful, proceed to insert/update contenders + return self + .db + .insert_or_update_contenders(name, &contenders, document_type, self) + .map_err(|e| e.to_string()); + } + Err(e) => { tracing::error!("Error fetching contested resources: {}", e); - format!("Error fetching contested resources: {}", e) - })?; - self.db - .insert_or_update_contenders(name, &contenders, document_type, self) - .map_err(|e| e.to_string()) + let error_str = e.to_string(); + if error_str.contains("try another server") + || error_str.contains( + "contract not found when querying from value with contract info", + ) + { + retries += 1; + if retries > MAX_RETRIES { + tracing::error!( + "Max retries reached for query_dpns_vote_contenders: {}", + e + ); + return Err(format!( + "Error fetching contested resources after retries: {}", + e + )); + } else { + continue; + } + } else { + // For other errors, return immediately + return Err(format!("Error fetching contested resources: {}", e)); + } + } + } + } } } From 9718ff0e18c6df049bd84ac1f1ea816470ede4a2 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Tue, 19 Nov 2024 20:04:02 +0700 Subject: [PATCH 3/3] remove unnecessary check --- src/ui/dpns_contested_names_screen.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/ui/dpns_contested_names_screen.rs b/src/ui/dpns_contested_names_screen.rs index dd8ce1c9f..07a84438d 100644 --- a/src/ui/dpns_contested_names_screen.rs +++ b/src/ui/dpns_contested_names_screen.rs @@ -786,9 +786,7 @@ impl ScreenLike for DPNSContestedNamesScreen { } fn display_message(&mut self, message: &str, message_type: MessageType) { - if !message.contains("try another server") { - self.error_message = Some((message.to_string(), message_type, Utc::now())); - } + self.error_message = Some((message.to_string(), message_type, Utc::now())); } fn ui(&mut self, ctx: &Context) -> AppAction {