Skip to content

Commit

Permalink
Default connection and request timeouts of 5 seconds
Browse files Browse the repository at this point in the history
  • Loading branch information
tustvold committed Oct 13, 2023
1 parent c6387c1 commit 7fc8ed9
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 6 deletions.
4 changes: 2 additions & 2 deletions object_store/src/aws/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ use serde::{Deserialize, Serialize};
use snafu::{ensure, OptionExt, ResultExt, Snafu};
use std::str::FromStr;
use std::sync::Arc;
use std::time::Duration;
use tokio::io::AsyncWrite;
use tracing::info;
use url::Url;
Expand Down Expand Up @@ -1057,8 +1058,7 @@ impl AmazonS3Builder {

Arc::new(TokenCredentialProvider::new(
token,
// The instance metadata endpoint is access over HTTP
self.client_options.clone().with_allow_http(true).client()?,
self.client_options.metadata_client()?,
self.retry_config.clone(),
)) as _
};
Expand Down
3 changes: 2 additions & 1 deletion object_store/src/azure/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ use snafu::{OptionExt, ResultExt, Snafu};
use std::fmt::{Debug, Formatter};
use std::str::FromStr;
use std::sync::Arc;
use std::time::Duration;
use tokio::io::AsyncWrite;
use url::Url;

Expand Down Expand Up @@ -1074,7 +1075,7 @@ impl MicrosoftAzureBuilder {
);
Arc::new(TokenCredentialProvider::new(
msi_credential,
self.client_options.clone().with_allow_http(true).client()?,
self.client_options.metadata_client()?,
self.retry_config.clone(),
)) as _
};
Expand Down
45 changes: 43 additions & 2 deletions object_store/src/client/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ impl FromStr for ClientConfigKey {
}

/// HTTP client configuration for remote object stores
#[derive(Debug, Clone, Default)]
#[derive(Debug, Clone)]
pub struct ClientOptions {
user_agent: Option<ConfigValue<HeaderValue>>,
content_type_map: HashMap<String, String>,
Expand All @@ -188,6 +188,35 @@ pub struct ClientOptions {
http2_only: ConfigValue<bool>,
}

impl Default for ClientOptions {
fn default() -> Self {
// Defaults based on
// <https://docs.aws.amazon.com/sdkref/latest/guide/feature-smart-config-defaults.html>
// <https://docs.aws.amazon.com/whitepapers/latest/s3-optimizing-performance-best-practices/timeouts-and-retries-for-latency-sensitive-applications.html>
// Which recommend a connection timeout of 3.1s and a request timeout of 2s
Self {
user_agent: None,
content_type_map: Default::default(),
default_content_type: None,
default_headers: None,
proxy_url: None,
proxy_ca_certificate: None,
proxy_excludes: None,
allow_http: Default::default(),
allow_insecure: Default::default(),
timeout: Some(Duration::from_secs(5).into()),
connect_timeout: Some(Duration::from_secs(5).into()),
pool_idle_timeout: None,
pool_max_idle_per_host: None,
http2_keep_alive_interval: None,
http2_keep_alive_timeout: None,
http2_keep_alive_while_idle: Default::default(),
http1_only: Default::default(),
http2_only: Default::default(),
}
}
}

impl ClientOptions {
/// Create a new [`ClientOptions`] with default values
pub fn new() -> Self {
Expand Down Expand Up @@ -444,7 +473,19 @@ impl ClientOptions {
}
}

pub(crate) fn client(&self) -> super::Result<Client> {
/// Create a [`Client`] with overrides optimised for metadata endpoint access
///
/// In particular:
/// * Allows HTTP as metadata endpoints do not use TLS
/// * Configures a low connection timeout to provide quick feedback if not present
pub(crate) fn metadata_client(&self) -> Result<Client> {
self.clone()
.with_allow_http(true)
.with_connect_timeout(Duration::from_secs(1))
.client()
}

pub(crate) fn client(&self) -> Result<Client> {
let mut builder = ClientBuilder::new();

match &self.user_agent {
Expand Down
2 changes: 1 addition & 1 deletion object_store/src/gcp/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1080,7 +1080,7 @@ impl GoogleCloudStorageBuilder {
} else {
Arc::new(TokenCredentialProvider::new(
InstanceCredentialProvider::new(audience),
self.client_options.clone().with_allow_http(true).client()?,
self.client_options.metadata_client()?,
self.retry_config.clone(),
)) as _
};
Expand Down

0 comments on commit 7fc8ed9

Please sign in to comment.