From 70f6b8f6a0d0aaaa01f913f974b9da24c3e5aa1d Mon Sep 17 00:00:00 2001 From: zhengpeng <847850277@qq.com> Date: Mon, 2 Dec 2024 14:35:01 +0800 Subject: [PATCH 1/5] [ISSUES#] 2739 sozo health check. --- bin/sozo/src/commands/migrate.rs | 8 +++++++- bin/sozo/src/utils.rs | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/bin/sozo/src/commands/migrate.rs b/bin/sozo/src/commands/migrate.rs index ebc37ae0c2..fc4ae075ae 100644 --- a/bin/sozo/src/commands/migrate.rs +++ b/bin/sozo/src/commands/migrate.rs @@ -141,7 +141,13 @@ async fn print_banner(ws: &Workspace<'_>, starknet: &StarknetOptions) -> Result< let profile_config = ws.load_profile_config()?; let (provider, rpc_url) = starknet.provider(profile_config.env.as_ref())?; - let chain_id = provider.chain_id().await?; + let chain_id_result = provider.chain_id().await; + if chain_id_result.is_err() { + let error_info = + format!("Unhealthy provider {:?}, please check your configuration.", provider); + return Err(anyhow::anyhow!(error_info)); + } + let chain_id = chain_id_result.unwrap(); let chain_id = parse_cairo_short_string(&chain_id).with_context(|| "Cannot parse chain_id as string")?; diff --git a/bin/sozo/src/utils.rs b/bin/sozo/src/utils.rs index cc108a55cc..32860e47a3 100644 --- a/bin/sozo/src/utils.rs +++ b/bin/sozo/src/utils.rs @@ -115,7 +115,13 @@ pub async fn get_world_diff_and_provider( let (provider, rpc_url) = starknet.provider(env)?; trace!(?provider, "Provider initialized."); - let spec_version = provider.spec_version().await?; + let spec_version_result = provider.spec_version().await; + if spec_version_result.is_err() { + let error_info = + format!("Unhealthy provider {:?}, please check your configuration.", provider); + return Err(anyhow::anyhow!(error_info)); + } + let spec_version = spec_version_result.unwrap(); trace!(spec_version); if !is_compatible_version(&spec_version, RPC_SPEC_VERSION)? { From e16ab2e8dce4a78e7a5f0b8f636f82b271409895 Mon Sep 17 00:00:00 2001 From: zhengpeng <847850277@qq.com> Date: Tue, 3 Dec 2024 11:40:27 +0800 Subject: [PATCH 2/5] [ISSUES#] 2739 provider health check for sozo. --- bin/sozo/src/commands/migrate.rs | 19 +++++++++++-------- bin/sozo/src/commands/mod.rs | 8 ++++++-- bin/sozo/src/utils.rs | 19 +++++++++++-------- crates/dojo/utils/src/lib.rs | 1 + crates/dojo/utils/src/utils.rs | 22 ++++++++++++++++++++++ crates/torii/core/Cargo.toml | 1 + crates/torii/core/src/engine.rs | 2 +- crates/torii/core/src/utils.rs | 23 +---------------------- 8 files changed, 54 insertions(+), 41 deletions(-) create mode 100644 crates/dojo/utils/src/utils.rs diff --git a/bin/sozo/src/commands/migrate.rs b/bin/sozo/src/commands/migrate.rs index fc4ae075ae..88240a14b9 100644 --- a/bin/sozo/src/commands/migrate.rs +++ b/bin/sozo/src/commands/migrate.rs @@ -1,6 +1,8 @@ -use anyhow::{Context, Result}; +use crate::commands::LOG_TARGET; +use anyhow::{anyhow, Context, Result}; use clap::Args; use colored::*; +use dojo_utils::utils::health_check_provider; use dojo_utils::{self, TxnConfig}; use dojo_world::contracts::WorldContract; use dojo_world::services::IpfsService; @@ -10,9 +12,10 @@ use sozo_ops::migration_ui::MigrationUi; use sozo_scarbext::WorkspaceExt; use starknet::core::utils::parse_cairo_short_string; use starknet::providers::Provider; +use std::sync::Arc; use tabled::settings::Style; use tabled::{Table, Tabled}; -use tracing::trace; +use tracing::{error, trace}; use super::options::account::AccountOptions; use super::options::ipfs::IpfsOptions; @@ -141,13 +144,13 @@ async fn print_banner(ws: &Workspace<'_>, starknet: &StarknetOptions) -> Result< let profile_config = ws.load_profile_config()?; let (provider, rpc_url) = starknet.provider(profile_config.env.as_ref())?; - let chain_id_result = provider.chain_id().await; - if chain_id_result.is_err() { - let error_info = - format!("Unhealthy provider {:?}, please check your configuration.", provider); - return Err(anyhow::anyhow!(error_info)); + let provider = Arc::new(provider); + if let Err(e) = health_check_provider(provider.clone()).await { + error!(target: LOG_TARGET,"Provider health check failed during sozo migrate."); + return Err(e); } - let chain_id = chain_id_result.unwrap(); + let provider = Arc::try_unwrap(provider).map_err(|_| anyhow!("Failed to unwrap Arc"))?; + let chain_id = provider.chain_id().await?; let chain_id = parse_cairo_short_string(&chain_id).with_context(|| "Cannot parse chain_id as string")?; diff --git a/bin/sozo/src/commands/mod.rs b/bin/sozo/src/commands/mod.rs index 6ee218b2da..d5ee653c98 100644 --- a/bin/sozo/src/commands/mod.rs +++ b/bin/sozo/src/commands/mod.rs @@ -34,6 +34,8 @@ use migrate::MigrateArgs; use model::ModelArgs; use test::TestArgs; +pub(crate) const LOG_TARGET: &str = "sozo::cli"; + #[derive(Debug, Subcommand)] pub enum Commands { #[command(about = "Grant or revoke a contract permission to write to a resource")] @@ -42,8 +44,10 @@ pub enum Commands { Build(Box), #[command(about = "Build and migrate the world every time a file changes")] Dev(Box), - #[command(about = "Run a migration, declaring and deploying contracts as necessary to update \ - the world")] + #[command( + about = "Run a migration, declaring and deploying contracts as necessary to update \ + the world" + )] Migrate(Box), #[command(about = "Execute a system with the given calldata.")] Execute(Box), diff --git a/bin/sozo/src/utils.rs b/bin/sozo/src/utils.rs index 32860e47a3..3eebe173f5 100644 --- a/bin/sozo/src/utils.rs +++ b/bin/sozo/src/utils.rs @@ -1,10 +1,13 @@ use std::collections::HashMap; use std::io::{self, Write}; use std::str::FromStr; +use std::sync::Arc; +use crate::commands::LOG_TARGET; use anyhow::{anyhow, Context, Result}; use camino::Utf8PathBuf; use colored::*; +use dojo_utils::utils::health_check_provider; use dojo_world::config::ProfileConfig; use dojo_world::contracts::ContractInfo; use dojo_world::diff::WorldDiff; @@ -19,7 +22,7 @@ use starknet::core::types::Felt; use starknet::core::utils as snutils; use starknet::providers::jsonrpc::HttpTransport; use starknet::providers::{JsonRpcClient, Provider}; -use tracing::trace; +use tracing::{error, trace}; use crate::commands::options::account::{AccountOptions, SozoAccount}; use crate::commands::options::starknet::StarknetOptions; @@ -113,15 +116,15 @@ pub async fn get_world_diff_and_provider( let world_address = get_world_address(&profile_config, &world, &world_local)?; let (provider, rpc_url) = starknet.provider(env)?; + let provider = Arc::new(provider); + if let Err(e) = health_check_provider(provider.clone()).await { + error!(target: LOG_TARGET,"Provider health check failed during sozo inspect."); + return Err(e); + } + let provider = Arc::try_unwrap(provider).map_err(|_| anyhow!("Failed to unwrap Arc"))?; trace!(?provider, "Provider initialized."); - let spec_version_result = provider.spec_version().await; - if spec_version_result.is_err() { - let error_info = - format!("Unhealthy provider {:?}, please check your configuration.", provider); - return Err(anyhow::anyhow!(error_info)); - } - let spec_version = spec_version_result.unwrap(); + let spec_version = provider.spec_version().await?; trace!(spec_version); if !is_compatible_version(&spec_version, RPC_SPEC_VERSION)? { diff --git a/crates/dojo/utils/src/lib.rs b/crates/dojo/utils/src/lib.rs index 96524d1805..3bcf45be61 100644 --- a/crates/dojo/utils/src/lib.rs +++ b/crates/dojo/utils/src/lib.rs @@ -14,3 +14,4 @@ pub mod env; pub mod keystore; pub mod signal; +pub mod utils; diff --git a/crates/dojo/utils/src/utils.rs b/crates/dojo/utils/src/utils.rs new file mode 100644 index 0000000000..7d343f51e5 --- /dev/null +++ b/crates/dojo/utils/src/utils.rs @@ -0,0 +1,22 @@ +use starknet::core::types::{BlockId, BlockTag}; +use starknet::providers::Provider; +use tracing::trace; + +pub async fn health_check_provider( + provider: P, +) -> anyhow::Result<(), anyhow::Error> { + match provider.get_block_with_tx_hashes(BlockId::Tag(BlockTag::Latest)).await { + Ok(block) => { + trace!( + latest_block = ?block, + "Provider health check." + ); + Ok(()) + } + Err(_) => { + let error_info = + format!("Unhealthy provider {:?}, please check your configuration.", provider); + Err(anyhow::anyhow!(error_info)) + } + } +} diff --git a/crates/torii/core/Cargo.toml b/crates/torii/core/Cargo.toml index 09b25d8cca..b9c90fa17e 100644 --- a/crates/torii/core/Cargo.toml +++ b/crates/torii/core/Cargo.toml @@ -18,6 +18,7 @@ chrono.workspace = true crypto-bigint.workspace = true data-url.workspace = true dojo-types.workspace = true +dojo-utils.workspace = true dojo-world.workspace = true futures-channel = "0.3.0" futures-util.workspace = true diff --git a/crates/torii/core/src/engine.rs b/crates/torii/core/src/engine.rs index 2d1299ebda..d1ee15266f 100644 --- a/crates/torii/core/src/engine.rs +++ b/crates/torii/core/src/engine.rs @@ -6,6 +6,7 @@ use std::time::Duration; use anyhow::Result; use bitflags::bitflags; +use dojo_utils::utils::health_check_provider; use dojo_world::contracts::world::WorldContractReader; use futures_util::future::{join_all, try_join_all}; use hashlink::LinkedHashMap; @@ -45,7 +46,6 @@ use crate::processors::{ }; use crate::sql::{Cursors, Sql}; use crate::types::{Contract, ContractType}; -use crate::utils::health_check_provider; type EventProcessorMap

= HashMap>>>; diff --git a/crates/torii/core/src/utils.rs b/crates/torii/core/src/utils.rs index 27f68f62d8..a0f0fac94c 100644 --- a/crates/torii/core/src/utils.rs +++ b/crates/torii/core/src/utils.rs @@ -4,10 +4,8 @@ use anyhow::Result; use chrono::{DateTime, Utc}; use futures_util::TryStreamExt; use ipfs_api_backend_hyper::{IpfsApi, IpfsClient, TryFromUri}; -use starknet::core::types::{BlockId, BlockTag}; -use starknet::providers::Provider; use tokio_util::bytes::Bytes; -use tracing::{info, trace}; +use tracing::info; use crate::constants::{ IPFS_CLIENT_MAX_RETRY, IPFS_CLIENT_PASSWORD, IPFS_CLIENT_URL, IPFS_CLIENT_USERNAME, @@ -48,25 +46,6 @@ pub async fn fetch_content_from_ipfs(cid: &str, mut retries: u8) -> Result( - provider: P, -) -> Result<(), anyhow::Error> { - match provider.get_block_with_tx_hashes(BlockId::Tag(BlockTag::Latest)).await { - Ok(block) => { - trace!( - latest_block = ?block, - "Provider health check." - ); - Ok(()) - } - Err(_) => { - let error_info = - format!("Unhealthy provider {:?}, please check your configuration.", provider); - Err(anyhow::anyhow!(error_info)) - } - } -} - // tests #[cfg(test)] mod tests { From 9d757f1681d8768b991de88a464b3a35a58e1ef5 Mon Sep 17 00:00:00 2001 From: zhengpeng <847850277@qq.com> Date: Tue, 3 Dec 2024 11:47:32 +0800 Subject: [PATCH 3/5] [ISSUES#] 2739 provider health check for sozo. --- bin/sozo/src/commands/mod.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/bin/sozo/src/commands/mod.rs b/bin/sozo/src/commands/mod.rs index d5ee653c98..9ca42277f3 100644 --- a/bin/sozo/src/commands/mod.rs +++ b/bin/sozo/src/commands/mod.rs @@ -44,10 +44,8 @@ pub enum Commands { Build(Box), #[command(about = "Build and migrate the world every time a file changes")] Dev(Box), - #[command( - about = "Run a migration, declaring and deploying contracts as necessary to update \ - the world" - )] + #[command(about = "Run a migration, declaring and deploying contracts as necessary to update \ + the world")] Migrate(Box), #[command(about = "Execute a system with the given calldata.")] Execute(Box), From 727017d3953beb865e8e4049fe23d6d25507d43b Mon Sep 17 00:00:00 2001 From: zhengpeng <847850277@qq.com> Date: Tue, 3 Dec 2024 12:33:45 +0800 Subject: [PATCH 4/5] [ISSUES#] 2739 provider health check for sozo fmt. --- bin/sozo/src/commands/migrate.rs | 5 +++-- bin/sozo/src/utils.rs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/bin/sozo/src/commands/migrate.rs b/bin/sozo/src/commands/migrate.rs index 88240a14b9..bfe7c52c39 100644 --- a/bin/sozo/src/commands/migrate.rs +++ b/bin/sozo/src/commands/migrate.rs @@ -1,4 +1,5 @@ -use crate::commands::LOG_TARGET; +use std::sync::Arc; + use anyhow::{anyhow, Context, Result}; use clap::Args; use colored::*; @@ -12,7 +13,6 @@ use sozo_ops::migration_ui::MigrationUi; use sozo_scarbext::WorkspaceExt; use starknet::core::utils::parse_cairo_short_string; use starknet::providers::Provider; -use std::sync::Arc; use tabled::settings::Style; use tabled::{Table, Tabled}; use tracing::{error, trace}; @@ -22,6 +22,7 @@ use super::options::ipfs::IpfsOptions; use super::options::starknet::StarknetOptions; use super::options::transaction::TransactionOptions; use super::options::world::WorldOptions; +use crate::commands::LOG_TARGET; use crate::utils; #[derive(Debug, Clone, Args)] diff --git a/bin/sozo/src/utils.rs b/bin/sozo/src/utils.rs index 3eebe173f5..01e6ee0a09 100644 --- a/bin/sozo/src/utils.rs +++ b/bin/sozo/src/utils.rs @@ -3,7 +3,6 @@ use std::io::{self, Write}; use std::str::FromStr; use std::sync::Arc; -use crate::commands::LOG_TARGET; use anyhow::{anyhow, Context, Result}; use camino::Utf8PathBuf; use colored::*; @@ -27,6 +26,7 @@ use tracing::{error, trace}; use crate::commands::options::account::{AccountOptions, SozoAccount}; use crate::commands::options::starknet::StarknetOptions; use crate::commands::options::world::WorldOptions; +use crate::commands::LOG_TARGET; /// Computes the world address based on the provided options. pub fn get_world_address( From d70090a5e737b6b06ff2f7915c1b9a8b4454e713 Mon Sep 17 00:00:00 2001 From: glihm Date: Mon, 9 Dec 2024 12:33:07 -0600 Subject: [PATCH 5/5] fix: new utils provider module and minor fixes --- bin/sozo/src/commands/migrate.rs | 5 ++--- bin/sozo/src/utils.rs | 4 ++-- crates/dojo/utils/src/lib.rs | 3 +-- crates/dojo/utils/src/{utils.rs => provider.rs} | 4 ++++ crates/torii/core/src/engine.rs | 4 ++-- examples/spawn-and-move/Scarb.lock | 2 +- 6 files changed, 12 insertions(+), 10 deletions(-) rename crates/dojo/utils/src/{utils.rs => provider.rs} (81%) diff --git a/bin/sozo/src/commands/migrate.rs b/bin/sozo/src/commands/migrate.rs index bfe7c52c39..30331257d3 100644 --- a/bin/sozo/src/commands/migrate.rs +++ b/bin/sozo/src/commands/migrate.rs @@ -3,8 +3,7 @@ use std::sync::Arc; use anyhow::{anyhow, Context, Result}; use clap::Args; use colored::*; -use dojo_utils::utils::health_check_provider; -use dojo_utils::{self, TxnConfig}; +use dojo_utils::{self, provider as provider_utils, TxnConfig}; use dojo_world::contracts::WorldContract; use dojo_world::services::IpfsService; use scarb::core::{Config, Workspace}; @@ -146,7 +145,7 @@ async fn print_banner(ws: &Workspace<'_>, starknet: &StarknetOptions) -> Result< let (provider, rpc_url) = starknet.provider(profile_config.env.as_ref())?; let provider = Arc::new(provider); - if let Err(e) = health_check_provider(provider.clone()).await { + if let Err(e) = provider_utils::health_check_provider(provider.clone()).await { error!(target: LOG_TARGET,"Provider health check failed during sozo migrate."); return Err(e); } diff --git a/bin/sozo/src/utils.rs b/bin/sozo/src/utils.rs index 01e6ee0a09..818b5ad7ec 100644 --- a/bin/sozo/src/utils.rs +++ b/bin/sozo/src/utils.rs @@ -6,7 +6,7 @@ use std::sync::Arc; use anyhow::{anyhow, Context, Result}; use camino::Utf8PathBuf; use colored::*; -use dojo_utils::utils::health_check_provider; +use dojo_utils::provider as provider_utils; use dojo_world::config::ProfileConfig; use dojo_world::contracts::ContractInfo; use dojo_world::diff::WorldDiff; @@ -117,7 +117,7 @@ pub async fn get_world_diff_and_provider( let (provider, rpc_url) = starknet.provider(env)?; let provider = Arc::new(provider); - if let Err(e) = health_check_provider(provider.clone()).await { + if let Err(e) = provider_utils::health_check_provider(provider.clone()).await { error!(target: LOG_TARGET,"Provider health check failed during sozo inspect."); return Err(e); } diff --git a/crates/dojo/utils/src/lib.rs b/crates/dojo/utils/src/lib.rs index 3bcf45be61..71435ba34c 100644 --- a/crates/dojo/utils/src/lib.rs +++ b/crates/dojo/utils/src/lib.rs @@ -12,6 +12,5 @@ pub use tx::*; pub mod env; pub mod keystore; - +pub mod provider; pub mod signal; -pub mod utils; diff --git a/crates/dojo/utils/src/utils.rs b/crates/dojo/utils/src/provider.rs similarity index 81% rename from crates/dojo/utils/src/utils.rs rename to crates/dojo/utils/src/provider.rs index 7d343f51e5..9e7eadfd6a 100644 --- a/crates/dojo/utils/src/utils.rs +++ b/crates/dojo/utils/src/provider.rs @@ -2,6 +2,10 @@ use starknet::core::types::{BlockId, BlockTag}; use starknet::providers::Provider; use tracing::trace; +/// Check if the provider is healthy. +/// +/// This function will check if the provider is healthy by getting the latest block, +/// and returns an error otherwise. pub async fn health_check_provider( provider: P, ) -> anyhow::Result<(), anyhow::Error> { diff --git a/crates/torii/core/src/engine.rs b/crates/torii/core/src/engine.rs index 22fe54b33e..a51b593844 100644 --- a/crates/torii/core/src/engine.rs +++ b/crates/torii/core/src/engine.rs @@ -6,7 +6,7 @@ use std::time::Duration; use anyhow::Result; use bitflags::bitflags; -use dojo_utils::utils::health_check_provider; +use dojo_utils::provider as provider_utils; use dojo_world::contracts::world::WorldContractReader; use futures_util::future::{join_all, try_join_all}; use hashlink::LinkedHashMap; @@ -253,7 +253,7 @@ impl Engine

{ } pub async fn start(&mut self) -> Result<()> { - if let Err(e) = health_check_provider(self.provider.clone()).await { + if let Err(e) = provider_utils::health_check_provider(self.provider.clone()).await { error!(target: LOG_TARGET,"Provider health check failed during engine start"); return Err(e); } diff --git a/examples/spawn-and-move/Scarb.lock b/examples/spawn-and-move/Scarb.lock index 7fda922985..60e51ef4db 100644 --- a/examples/spawn-and-move/Scarb.lock +++ b/examples/spawn-and-move/Scarb.lock @@ -31,7 +31,7 @@ dependencies = [ [[package]] name = "dojo_examples" -version = "1.0.3" +version = "1.0.5" dependencies = [ "armory", "bestiary",