Skip to content

Commit 65617ae

Browse files
Merge pull request #2126 from multiversx/retry-scenario
retry mechanism mx-scenario
2 parents 06fc9f4 + 76f9de1 commit 65617ae

File tree

3 files changed

+33
-10
lines changed

3 files changed

+33
-10
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

framework/meta/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ pathdiff = "0.2.1"
4242
common-path = "1.0.0"
4343
bip39 = "2.0.0"
4444
home = "=0.5.11"
45+
anyhow = "1.0"
4546

4647
[dependencies.multiversx-sc-meta-lib]
4748
version = "=0.59.1"

framework/meta/src/cmd/install/install_scenario_go.rs

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
1+
use anyhow::{anyhow, Result};
2+
use core::time;
13
use serde_json::Value;
24
use std::{
35
fs::File,
46
io::Write,
57
path::{Path, PathBuf},
8+
thread::sleep,
69
};
710

811
use multiversx_sc_meta_lib::print_util::println_green;
912

1013
use super::system_info::{get_system_info, SystemInfo};
1114

15+
const API_LIMIT_EXCEEDED: &str = "api rate limit exceeded for";
16+
const MAX_RETRIES: u64 = 5;
17+
const RETRY_DELAY: time::Duration = time::Duration::from_secs(2);
1218
const USER_AGENT: &str = "multiversx-sc-meta";
1319
const SCENARIO_CLI_RELEASES_BASE_URL: &str =
1420
"https://api.github.com/repos/multiversx/mx-chain-scenario-cli-go/releases";
@@ -78,20 +84,35 @@ impl ScenarioGoInstaller {
7884
}
7985
}
8086

81-
async fn get_scenario_go_release_json(&self) -> Result<String, reqwest::Error> {
87+
async fn get_scenario_go_release_json(&self) -> Result<String> {
8288
let release_url = self.release_url();
8389
println_green(format!("Retrieving release info: {release_url}"));
8490

85-
let response = reqwest::Client::builder()
86-
.user_agent(&self.user_agent)
87-
.build()?
88-
.get(release_url)
89-
.send()
90-
.await?
91-
.text()
92-
.await?;
91+
let mut wait_time = RETRY_DELAY;
92+
93+
for i in 0..MAX_RETRIES {
94+
let response = reqwest::Client::builder()
95+
.user_agent(&self.user_agent)
96+
.build()?
97+
.get(&release_url)
98+
.send()
99+
.await?
100+
.text()
101+
.await?;
102+
103+
if !response.to_lowercase().contains(API_LIMIT_EXCEEDED) {
104+
return Ok(response);
105+
}
106+
107+
println!("API rate limit exceeded, attempt {i} retrying...");
108+
sleep(wait_time);
109+
wait_time += RETRY_DELAY;
110+
}
93111

94-
Ok(response)
112+
Err(anyhow!(
113+
"Failed to retrieve release info after {} retries",
114+
MAX_RETRIES
115+
))
95116
}
96117

97118
fn parse_scenario_go_release(&self, raw_json: &str) -> ScenarioGoRelease {

0 commit comments

Comments
 (0)