Skip to content

Commit

Permalink
refactor: directly call stdlib w/o hyper-util
Browse files Browse the repository at this point in the history
  • Loading branch information
crepererum committed Feb 12, 2025
1 parent 33e88c2 commit 69f9f70
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 28 deletions.
4 changes: 1 addition & 3 deletions object_store/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ walkdir = "2"
# Cloud storage support
base64 = { version = "0.22", default-features = false, features = ["std"], optional = true }
hyper = { version = "1.2", default-features = false, optional = true }
hyper-util = { version = "0.1.10", default-features = false, optional = true, features = ["client", "client-legacy", "tokio"] }
quick-xml = { version = "0.37.0", features = ["serialize", "overlapped-lists"], optional = true }
serde = { version = "1.0", default-features = false, features = ["derive"], optional = true }
serde_json = { version = "1.0", default-features = false, optional = true }
Expand All @@ -55,15 +54,14 @@ reqwest = { version = "0.12", default-features = false, features = ["rustls-tls-
ring = { version = "0.17", default-features = false, features = ["std"], optional = true }
rustls-pemfile = { version = "2.0", default-features = false, features = ["std"], optional = true }
tokio = { version = "1.29.0", features = ["sync", "macros", "rt", "time", "io-util"] }
tower-service = { version = "0.3", default-features = false, optional = true }
md-5 = { version = "0.10.6", default-features = false, optional = true }
httparse = { version = "1.8.0", default-features = false, features = ["std"], optional = true }

[target.'cfg(target_family="unix")'.dev-dependencies]
nix = { version = "0.29.0", features = ["fs"] }

[features]
cloud = ["serde", "serde_json", "tower-service", "quick-xml", "hyper", "hyper-util", "reqwest", "reqwest/json", "reqwest/stream", "chrono/serde", "base64", "rand", "ring"]
cloud = ["serde", "serde_json", "quick-xml", "hyper", "reqwest", "reqwest/json", "reqwest/stream", "chrono/serde", "base64", "rand", "ring"]
azure = ["cloud", "httparse"]
gcp = ["cloud", "rustls-pemfile"]
aws = ["cloud", "md-5"]
Expand Down
39 changes: 15 additions & 24 deletions object_store/src/client/dns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,45 +15,36 @@
// specific language governing permissions and limitations
// under the License.

use std::str::FromStr;
use std::net::ToSocketAddrs;

use hyper_util::client::legacy::connect::dns::{
GaiResolver as HyperGaiResolver, Name as HyperName,
};
use rand::prelude::SliceRandom;
use reqwest::dns::{Addrs, Name, Resolve, Resolving};
use tower_service::Service;
use tokio::task::JoinSet;

type DynErr = Box<dyn std::error::Error + Send + Sync>;

#[derive(Debug)]
pub(crate) struct ShuffleResolver(HyperGaiResolver);

impl Default for ShuffleResolver {
fn default() -> Self {
Self(HyperGaiResolver::new())
}
}
pub(crate) struct ShuffleResolver;

impl Resolve for ShuffleResolver {
fn resolve(&self, name: Name) -> Resolving {
let inner = self.0.clone();

Box::pin(async move {
let mut inner = inner;
// use `JoinSet` to propagate cancelation
let mut tasks = JoinSet::new();
tasks.spawn_blocking(move || {
let it = (name.as_str(), 0).to_socket_addrs()?;
let mut addrs = it.collect::<Vec<_>>();

// convert name reqwest -> hyper
let name = HyperName::from_str(name.as_str()).map_err(|err| Box::new(err) as DynErr)?;
addrs.shuffle(&mut rand::rng());

let mut addr = inner
.call(name)
Ok(Box::new(addrs.into_iter()) as Addrs)
});

tasks
.join_next()
.await
.expect("spawned on task")
.map_err(|err| Box::new(err) as DynErr)?
.collect::<Vec<_>>();

addr.shuffle(&mut rand::rng());

Ok(Box::new(addr.into_iter()) as Addrs)
})
}
}
2 changes: 1 addition & 1 deletion object_store/src/client/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -690,7 +690,7 @@ impl ClientOptions {
builder = builder.no_gzip();

if self.randomize_addresses.get()? {
builder = builder.dns_resolver(Arc::new(dns::ShuffleResolver::default()));
builder = builder.dns_resolver(Arc::new(dns::ShuffleResolver));
}

builder
Expand Down

0 comments on commit 69f9f70

Please sign in to comment.