diff --git a/Cargo.lock b/Cargo.lock index c7af140f7d..7cb65dd626 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4667,6 +4667,7 @@ dependencies = [ "once_cell", "pin-project-lite", "rand 0.8.5", + "reqwest 0.11.19", "scopeguard", "serde", "serde_json", diff --git a/libs/remote_storage/Cargo.toml b/libs/remote_storage/Cargo.toml index 1816825bda..ead140adc7 100644 --- a/libs/remote_storage/Cargo.toml +++ b/libs/remote_storage/Cargo.toml @@ -18,6 +18,7 @@ camino = { workspace = true, features = ["serde1"] } humantime-serde.workspace = true hyper = { workspace = true, features = ["client"] } futures.workspace = true +reqwest = { version = "0.11", default-features = false, features = ["rustls-tls"] } serde.workspace = true serde_json.workspace = true tokio = { workspace = true, features = ["sync", "fs", "io-util"] } diff --git a/libs/remote_storage/src/azure_blob.rs b/libs/remote_storage/src/azure_blob.rs index 1c0d43d479..345f559798 100644 --- a/libs/remote_storage/src/azure_blob.rs +++ b/libs/remote_storage/src/azure_blob.rs @@ -15,6 +15,8 @@ use std::time::SystemTime; use super::REMOTE_STORAGE_PREFIX_SEPARATOR; use anyhow::Result; use azure_core::request_options::{IfMatchCondition, MaxResults, Metadata, Range}; +use azure_core::HttpClient; +use azure_core::TransportOptions; use azure_core::{Continuable, RetryOptions}; use azure_identity::DefaultAzureCredential; use azure_storage::StorageCredentials; @@ -71,7 +73,9 @@ impl AzureBlobStorage { }; // we have an outer retry - let builder = ClientBuilder::new(account, credentials).retry(RetryOptions::none()); + let builder = ClientBuilder::new(account, credentials) + .retry(RetryOptions::none()) + .transport(TransportOptions::new(reqwest_client(true))); let client = builder.container_client(azure_config.container_name.to_owned()); @@ -244,6 +248,15 @@ impl AzureBlobStorage { } } +fn reqwest_client(allow_idle_connections: bool) -> Arc { + let max_idle = if allow_idle_connections { 8 } else { 0 }; + let client = reqwest::ClientBuilder::new() + .pool_max_idle_per_host(max_idle) + .build() + .expect("failed to build `reqwest` client"); + Arc::new(client) +} + fn to_azure_metadata(metadata: StorageMetadata) -> Metadata { let mut res = Metadata::new(); for (k, v) in metadata.0.into_iter() {